абстрактный шаблон дизайна фабрики c # - PullRequest
0 голосов
/ 15 июля 2010

Привет, я новичок в разработке шаблона и прошу прощения, если этот вопрос создает какую-то путаницу, хотя я пытаюсь описать проблему наилучшим образом. Я реализовал образец абстрактного шаблона фабрики в winforms.Внешний интерфейс содержит два флажка для создания объектов.Примечание. Если оба флажка установлены, оба объекта создаются.Я использую метод objs.CreateProduct (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 ]

1 голос
/ 15 июля 2010

Я бы предложил изменить этот код. Abstract Factory - это создание абстрактного продукта, скажем, автомобиля по вашему образцу. Конкретная фабрика добавляет черту продукта. Допустим, 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();

        }

    }
0 голосов
/ 15 июля 2010

Интерфейс базового класса фабрики должен позволять клиентам создавать любые экземпляры-потомки, основываясь только на параметрах, предоставленных его методу create.Все дело в том, чтобы отделить создание объекта от знаний о конкретных конкретных типах, например, для обеспечения возможности внедрения зависимости.

Если вы хотите предоставить различные данные инициализации различным фабрикам-потомкам, эти данные должны содержаться или предоставляться самому классу фабрики (поскольку любой код, создающий и настраивающий фабрики, является единственной частью, о которой следует знатьконкретный тип).Итак, инициализируйте B значением bool для Ultima и C значением Maxima.

Честно говоря, вы, возможно, слишком сильно отредактировали свой пример: я не совсем уверен в том, что вы пытаетесь сделать.Если код WinForms не знает о конкретных типах, вам потребуется ввести какой-то разделительный интерфейс между ним и кодом создания фабрики, чтобы передать данные инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...