Заводской шаблон проектирования (нуждается в критике)

Я собираю объяснение и пример кода этого шаблона проектирования, пытаясь помочь окружающим меня понять его (а также помогу себе освоить этот шаблон).

Что я я ищу мнения или критику моего объяснения и образца кода ... спасибо!

Что такое фабричный шаблон? пытаюсь помочь окружающим понять это (а также помогать себе овладеть шаблоном). Что я ищу ...

Я собираю объяснение и пример кода этого шаблона проектирования, пытаясь помочь окружающим меня понять его (а также помогу себе освоить этот шаблон).

Что я я ищу мнения или критику моего объяснения и образца кода ... спасибо!

Что такое фабричный шаблон? пытаюсь помочь окружающим понять это (а также помогать себе овладеть шаблоном). Что я ищу ...

Я собираю объяснение и пример кода этого шаблона проектирования, пытаясь помочь окружающим меня понять его (а также помогу себе освоить этот шаблон).

Что я я ищу мнения или критику моего объяснения и образца кода ... спасибо!

Что такое фабричный шаблон? Шаблон фабрики использует специальный выделенный «объект-создатель объекта» для обработки создания - и в большинстве случаев создания экземпляров - объектов, подобно фабрике в реальном мире.

Пример из реального мира
Представьте себе автомобильный завод, который является производителем различных типов автомобилей. Одна из сборочных линий этого автомобильного завода может сегодня производить грузовик, а в другой день может быть переоборудована для производства автомобилей. Допустим, дилерский центр размещает заказ на 10 автомобилей в назначенный им отдел обслуживания клиентов. Затем этот отдел использует определенный завод и заказывает 10 автомобилей. Кураторы счетов не заботятся о производстве автомобилей сами (представьте себе плохие результаты), они работают только с конечным продуктом, гарантируя, что автосалон получит их автомобили.

В следующем году выходит новая модель той же машины, и заказы начинают поступать. Специалисты по работе с клиентами (все еще не заинтересованные в производстве машины) размещают заказы, но теперь машина, которую они получают, другая, сборка метод или даже фабрика в целом могут быть разными, но обработчикам учетных записей не нужно об этом беспокоиться. Дополнительная мысль: заводские сборщики транспортных средств могут точно знать, что предпринять, если определенный обработчик учетной записи размещает заказ (например, обработчик учетной записи X размещает заказ, заводской сборщик знает, что для обработчика учетной записи X они производят 10 транспортных средств типа Y ). Другой вариант может заключаться в том, что обработчик учетных записей сообщает сборщику, какой именно тип транспортного средства производить.

Если обработчики учетных записей также занимались созданием транспортных средств (т.е. они были связаны), каждый раз, когда транспортное средство каким-либо образом менялось, каждый из обработчиков учетных записей должен был проходить переподготовку для производства этого транспортного средства. Это создало бы проблемы с качеством, поскольку обработчиков учетных записей гораздо больше, чем фабрик ... возможны ошибки, расходы будут намного выше.

Возвращение к ООП
Фабрика объектов как шаблон проектирования, применяемый к программному обеспечению Конструирование аналогично приведенному выше примеру по концепции ... Фабрика производит различные типы других объектов, вы можете использовать сборочную линию (сборщик объектов), которая производит определенный тип объекта, возвращаемый определенным образом. Ассемблер может либо проверить запрашивающего клиента и дескриптор, либо клиент может сообщить ассемблеру, какой объект ему нужен. Теперь ... вы работаете над проектом и создаете фабрику объектов и различных ассемблеров, позже в процессе работы над проектом, требования немного меняются, теперь вас просят изменить содержимое объекта и то, как его клиенты обрабатывают этот объект. Поскольку вы использовали шаблон фабрики, это простое изменение, и в одном месте вы можете изменить или добавить объекты, производимые фабрикой, а также изменить формат, в котором ассемблеры выкладывают содержимое объекта.

Неудачный способ сделать это - без фабричного метода, создания экземпляра каждого экземпляра объекта и форматирования содержимого объекта в самих клиентах ... скажем, вы использовали этот конкретный объект в 20 клиентах. Теперь вы должны перейти к каждому из клиентов, изменить каждый из экземпляров и форматов объекта ... какая пустая трата времени ... Будь ленив ... сделай это правильно в первый раз, чтобы сэкономить время себе (и другим) и усилия позже.

Пример кода (C #)
Ниже приведен пример использования фабрики для продуктов питания и различных пищевых объектов

Factory module
    public enum FoodType
    {
    //enumerated foodtype value, if client wants to specify type of object, coupling still occurs
        Hamburger, Pizza, HotDog
    }
 
    /// <summary>
    /// Object to be overridden (logical)
    /// </summary>
    public abstract class Food
    {
        public abstract double FoodPrice { get; }
    }
 
    /// <summary>
    /// Factory object to be overridden (logical)
    /// </summary>
    public abstract class FoodFactory
    {
        public abstract Food CreateFood(FoodType type);
    }
 
    //-------------------------------------------------------------------------
    #region various food objects
    class Hamburger : Food
    {
        double _foodPrice = 3.59;
        public override double FoodPrice
        {
            get { return _foodPrice; }
        }
    }
 
    class Pizza : Food
    {
        double _foodPrice = 2.49;
        public override double FoodPrice
        {
            get { return _foodPrice; }
        }
    }
 
    class HotDog : Food
    {
        double _foodPrice = 1.49;
        public override double FoodPrice
        {
            get { return _foodPrice; }
        }
    }
    #endregion
    //--------------------------------------------------------------------------
 
 
    /// <summary>
    /// Physical factory
    /// </summary>
    public class ConcreteFoodFactory : FoodFactory
    {
        public override Food CreateFood(FoodType foodType)
        {
            switch (foodType)
            {
                case FoodType.Hamburger:
                    return new Hamburger();
                    break;
                case FoodType.HotDog:
                    return new HotDog();
                    break;
                case FoodType.Pizza:
                    return new Pizza();
                    break;
                default:
                    return null;
                    break;
            }
        }
    }
 
    /// <summary>
    /// Assemblers
    /// </summary>
    public class FoodAssembler
    {
        public string AssembleFoodAsString(object sender, FoodFactory factory)
        {
            Food food = factory.CreateFood(FoodType.Hamburger);
            if (sender.GetType().Name == "default_aspx")
            {
                return string.Format("The price for the hamburger is: ${0}", food.FoodPrice.ToString());
            }
            else
            {
                return food.FoodPrice.ToString();
            }  
        }
 
        public Food AssembleFoodObject(FoodFactory factory)
        {
            Food food = factory.CreateFood(FoodType.Hamburger);
            return food;
        }
    }

Calling factory
FoodFactory factory = new ConcreteFoodFactory(); //create an instance of the factoryenter code here
lblUser.Text = new FoodAssembler().AssembleFoodAsString(this, factory); //call the assembler which formats for string output

Object o = new FoodAssembler().AssembleFoodObject(factory); //example: instantiating anon object, initialized with created food object
6
задан dbobrowski 4 November 2010 в 18:31
поделиться