抽象工厂设计模式c#

时间:2010-07-15 09:35:17

标签: c# design-patterns

您好我是新手设计模式并道歉如果这个问题造成任何混乱,虽然我试图以最佳方式描述问题。我已经在winforms中实现了样本抽象工厂模式。前端包含两个用于创建对象的复选框。注意:如果同时选中该复选框,则会创建两个对象。 我正在使用objs.CreateProduct(Maxima,Ultima)方法并传递布尔值来创建对象。在这里,我传递两个属性的值,无论我是想为最终或最大值创建对象。您能否提出其他更好的方法来实现这一目标?如果我正在创建对象,我不想传递maxima和ultima的属性。

 public partial class Form1 : Form
    {
        public bool Maxima
        {
            get;
            set;
        }

        public bool Ultima
        {
            get;
            set;
        }


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Factory[] obj = new Factory[2];
            obj[0] = new B();
            obj[1] = new C();

            foreach (Factory objs in obj)
            {
                iProduct prod = objs.CreateProduct(Maxima,Ultima);
                if (prod != null)
                {
                    prod.GetDetails();
                }
            }

        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox2.Checked)
                Maxima = true;
                else
                Maxima = false;

            if (checkBox1.Checked)
                Ultima = true;
            else
                Ultima = false;
        }
    }


    abstract class Factory
    {
        public abstract iProduct CreateProduct(bool maxima, bool ultima);
    }

    class B : Factory
    {
        public override iProduct CreateProduct(bool maxima,bool ultima)
        {
            if (ultima)
            {
                return new NissanUltima();
            }
            else return null;
        }
    }

    class C : Factory
    {
        public override iProduct CreateProduct(bool maxima,bool ultima)
        {
            if (maxima)
            {
                return new NissanMaxima();
            }
            else return null;
        }
    }

    interface iProduct
    {
        void GetDetails();
    }

    class NissanUltima:iProduct
    {

        public void GetDetails()
        {
            MessageBox.Show("NissanUltima is created");
        }

    }

    class NissanMaxima:iProduct
    {
        public void GetDetails()
        {
             MessageBox.Show("NissanMaxima is created");
        }
    }

2 个答案:

答案 0 :(得分:1)

我建议重新设计该代码。抽象工厂是在你的样本中创建一个抽象的产品说汽车。特定工厂添加产品特征。让我们说Nissanfactory和Fordfactory 然后在每个CreateFactory()中,您可以模拟您想要创建的汽车模型。

 abstract class Factory
{
    public abstract iProduct CreateProduct(int Model);
}

class NissanFactory : Factory
{
    public override iProduct CreateProduct(int Model)
    {
        // say 1  is Maxima
        //say 2   is Untima 
        if (Model ==1)
        {
            return new NissanMaxima();
        }
        if(Model ==2)
        {
            return new NissanUltima();

        }
         return null;
    }
}

class FordFartory : Factory
{
    public override iProduct CreateProduct(int Model)
    {
        if (Model == 1)
        {
            return new GrandTorino();
        }
        if (Model == 2)
        {
            return new Mustang();

        }
        return null;
    }
}

//

 private void button1_Click(object sender, EventArgs e)
    {


         Factory[] obj = new Factory[1];
          obj[0] =new NissanFactory();

        private List<iProduct> products = new List<iProduct>();

        //create maxima if it's chacked
        if (checkBox2.Checked)
           products.Add(obj.CreateProduct(1));

         //create ultima
        if (checkBox1.Checked)
            products.Add(prod = obj.CreateProduct(2));

        //now you can navigate via list of created products
        foreach (IProduct car in products)
        {


                prod.GetDetails();

        }

    }

答案 1 :(得分:0)

工厂基类接口应该允许客户端仅基于提供给其create方法的参数来创建任何类型的后代实例。重点是将对象创建与特定具体类型的知识分离,以便允许例如依赖注入。

如果要为各种后代工厂提供不同的初始化数据,那么这些数据应该包含在工厂类中或提供给工厂类本身(因为无论代码是什么,创建和配置工厂都是应该了解具体类型的唯一部分)。因此,使用BUltima的bool值初始化C,其值为Maxima

坦率地说,你可能对你的例子进行了过多的编辑:我不确定你想要做什么。如果WinForms代码应该不知道具体类型,那么您需要在它和工厂创建代码之间引入某种解耦接口,以便传递初始化数据。