В чем основная разница между шаблонами проектирования «Фабрика» и «Абстрактная фабрика»?[закрыто]

StackOverflow https://stackoverflow.com/questions/1001767

Вопрос

В чем основная разница между паттернами Фабрика и Абстрактная Фабрика?

Это было полезно?

Решение

С помощью шаблона Factory вы создаете экземпляры реализаций ( Apple , Banana , Cherry и т. д.) определенного интерфейса - скажем, IFruit .

Используя шаблон Абстрактная фабрика, вы предоставляете возможность каждому создать собственную фабрику. Это позволяет вашему складу быть либо IFruitFactory , либо IJuiceFactory , при этом ваш склад не должен ничего знать о фруктах или соках.

Другие советы

  

Источник этой информации взят из: http://java.dzone.com / новости / интро-дизайн-шаблоны-абстрактные

Метод абстрактной фабрики против фабрики

Методы абстрактной фабрики реализованы как фабричные методы. И абстрактный шаблон фабрики, и шаблон метода фабрики отделяют клиентскую систему от реальных классов реализации через абстрактные типы и фабрики. Фабричный метод создает объекты с помощью наследования, а Абстрактная фабрика создает объекты с помощью композиции.

Шаблон Abstract Factory состоит из AbstractFactory, ConcreteFactory, AbstractProduct, ConcreteProduct и Client.

Как реализовать

Абстрактный шаблон фабрики может быть реализован с использованием шаблона фабричного метода, шаблона прототипа или шаблона Singleton. Объект ConcreteFactory может быть реализован как Singleton, поскольку необходим только один экземпляр объекта ConcreteFactory.

Шаблон Factory Method - это упрощенная версия шаблона Abstract Factory. Шаблон Factory Method отвечает за создание продуктов, принадлежащих одному семейству, а шаблон Abstract Factory - для нескольких семейств продуктов.

Метод Factory использует интерфейсы и абстрактные классы для отделения клиента от класса генератора и конечных продуктов. Абстрактная фабрика имеет генератор, который является контейнером для нескольких фабричных методов, а также интерфейсы, отделяющие клиента от генератора и продуктов.

Когда использовать шаблон фабричного метода

Используйте шаблон Factory Method, когда необходимо отделить клиент от определенного продукта, который он использует. Используйте фабричный метод, чтобы снять с клиента ответственность за создание и настройку экземпляров продукта.

Когда использовать абстрактный шаблон фабрики

Используйте шаблон Абстрактная фабрика, когда клиенты должны быть отделены от классов продуктов. Особенно полезно для настройки и модификации программы. Шаблон Абстрактная фабрика также может навязывать ограничения относительно того, какие классы должны использоваться с другими. Может быть много работы по созданию новых бетонных заводов.

Примеры:

Абстрактный фабричный пример 1

Эта спецификация для дисков для приготовления разных видов макарон в изготовителе макаронных изделий есть Абстрактная Фабрика, а каждый конкретный диск - Фабрика. все фабрики (диски для изготовления макаронных изделий) наследуют свои свойства от абстрактной фабрики. Каждый отдельный диск содержит информацию о том, как создавать макароны, а производитель макаронных изделий - нет.

Абстрактный пример фабрики 2:

Штамповочное оборудование соответствует абстрактной фабрике, так как интерфейс для операций, которые создают абстрактные объекты продукта. Плашки соответствуют бетонному заводу, поскольку они создают конкретный продукт. Каждая категория деталей (капот, дверь и т. Д.) Соответствует абстрактному произведению. Определенные части (то есть дверь со стороны водителя для 99 кулачков) соответствуют бетонные изделия.

Пример заводского метода:

Компания по производству игрушек соответствует Создателю, поскольку она может использовать фабрику для создания объектов товара. Подразделение компании по производству игрушек, которое производит игрушки определенного типа (лошади или машины), соответствует ConcreteCreator.

Заводской шаблон: Фабрика производит IProduct-реализации

Абстрактный шаблон фабрики: Фабрика производит фабрики IFactories, которые, в свою очередь, производят продукцию IP:)

[Обновить в соответствии с комментариями]
То, что я написал ранее, неверно, по крайней мере, согласно Википедии . Абстрактная фабрика - это просто фабричный интерфейс. С его помощью вы можете переключать свои фабрики во время выполнения, чтобы разрешить разные фабрики в разных контекстах. Примерами могут быть разные фабрики для разных ОС, провайдеры SQL, драйверы промежуточного программного обеспечения и т. Д.

Шаблон «Абстрактная фабрика»

  • Предоставьте интерфейс для создания семей с родственными или зависимыми объектами без указания их конкретных классов.

  • Абстрактный заводской шаблон очень похож на заводской шаблон метода.Одно отличие между ними заключается в том, что с помощью абстрактного заводского шаблона класс делегирует ответственность за создание объекта к другому объекту через состав, тогда как шаблон заводского метода использует наследование и полагается на подкласс для обработки желаемого экземпляра объекта.

  • На самом деле, делегированный объект часто использует фабричные методы для выполнения экземпляра!

Заводской образец

  • Заводские паттерны являются примерами творческих моделей

  • Сотворяющие паттерны абстрактно процесс создания объекта.Они скрывают, как создаются объекты, и помогают сделать общую систему независимой от того, как ее объекты создаются и составлены.

  • Классовые паттерны сосредоточены на использовании наследования для определения объекта для создания создания фабричного метода

  • Создание объекта сосредоточено на делегировании экземпляров на другой объект абстрактной фабрики

Ссылка:Фабрика против абстрактной фабрики

Фабричный метод: У вас есть фабрика, которая создает объекты, производные от определенного базового класса

Абстрактная фабрика: у вас есть фабрика, которая создает другие фабрики , и эти фабрики, в свою очередь, создают объекты, производные от базовых классов. Вы делаете это потому, что вы часто не просто хотите создать отдельный объект (как в методе Factory), а хотите создать коллекцию связанных объектов.

Абстрактная фабрика - это интерфейс для создания связанных объектов, но фабричный метод - это метод. Абстрактная фабрика реализуется фабричным методом.

введите описание изображения здесь

Основная разница:

Factory: Создает объекты без предоставления клиенту логики создания экземпляров.

Фабричный метод . Определите интерфейс для создания объекта, но пусть подклассы решают, какой класс создать. Метод Factory позволяет классу откладывать создание экземпляров для подклассов

Абстрактная фабрика . Предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.

Шаблон

AbstractFactory использует композицию, чтобы делегировать ответственность за создание объекта другому классу, в то время как шаблон Фабричный метод использует наследование и опирается на производный класс или подкласс для создания объекта

Из oodesign статей:

Factory диаграмма классов:

 введите описание изображения здесь

Пример: StaticFactory

 public class ShapeFactory {

   //use getShape method to get object of type shape 
   public static Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}

Нестатическая фабрика, реализующая пример FactoryMethod, доступна в этом посте:

Дизайн Шаблоны: метод фабрики против фабрики против абстрактной фабрики

Когда использовать: клиенту просто нужен класс, и ему все равно, какую конкретную реализацию он получает.

Метод фабрики класса digaram:

 введите описание изображения здесь

Когда использовать: Клиент не знает, какие конкретные классы необходимо будет создать во время выполнения, но просто хочет получить класс, который будет выполнять эту работу.

Абстрактная фабрика из диаграммы классов dzone

 введите описание изображения здесь

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

Примеры исходного кода в вышеприведенных статьях очень хорошо помогают понять концепции.

Связанный вопрос SE с примером кода:

Фабричный шаблон. Когда использовать фабричные методы?

Отличия:

<Ол>
  • Абстрактные фабричные классы часто реализуются с помощью фабричных методов, но они также могут быть реализованы с использованием прототипа
  • Проекты начинаются с использованием Factory Method (менее сложный, более настраиваемый, подклассы распространяются) и переходят к другим шаблонам создания (более гибким, более сложным), где требуется большая гибкость.
  • Фабричные методы обычно вызываются в шаблонных методах.
  • Другие полезные статьи:

    factory_method из создания источника

    abstract_factory из создания источника

    Пример / сценарий для абстрактной фабрики

    Я живу в месте, где идет дождь в сезон дождей, зимой идет снег, а летом жарко и солнечно. Мне нужна другая одежда, чтобы защитить себя от стихии. Для этого я иду в магазин рядом с моим домом и прошу одежду / предметы, чтобы защитить себя. Хранитель магазина дает мне соответствующий предмет в соответствии с окружающей средой и глубиной моего кармана. Предметы, которые он мне дает, имеют такой же уровень качества и ценовой категории. Поскольку он знает о моих стандартах, ему легко это сделать. Но когда богатый парень с другой стороны улицы предъявляет те же требования, он получает дорогой фирменный товар. Одна заметная вещь - все предметы, которые он дает мне, дополняют друг друга с точки зрения качества, стандарта и стоимости. Можно сказать, что они идут друг с другом. То же самое относится и к предметам, которые получает этот богатый парень.

    Итак, взглянув на вышеприведенный сценарий, я теперь оцениваю эффективность продавца. Я могу заменить этого лавочника абстрактным магазином. Предметы, которые мы получаем с абстрактными предметами, и я, и богатые как перспективные клиенты Все, что нам нужно, это продукт / предмет, который соответствует нашим потребностям.

    Теперь я легко вижу себя, рассматривая интернет-магазин, который предоставляет множество услуг своим многочисленным клиентам. Каждый клиент принадлежит к одной из трех групп. Когда пользователь премиум-группы открывает сайт, он получает отличный пользовательский интерфейс, настраиваемую панель рекламы, больше опций в меню и т. Д. Этот же набор функций представлен золотому пользователю, но функциональность в меню меньше, реклама в основном релевантна, и немного менее эргономичный интерфейс. Последний - мой тип пользователя, & # 8216; свободная группа & # 8217; пользователь. Я просто достаточно обслужен, чтобы не обижаться. Пользовательский интерфейс - это минимум, рекламные объявления настолько далеки от отслеживания, что я не знаю, что из этого выйдет, наконец, в меню есть только выход.

    Если бы у меня была возможность создать что-то подобное этому веб-сайту, я бы определенно рассмотрел шаблон Abstract Factory.

    Абстрактные продукты: Панель рекламы, Меню, Пользовательский интерфейс.
    Абстрактная фабрика: пользовательский опыт интернет-магазина
    Concreate Factory: пользовательский опыт премиум-класса, пользовательский опыт уровня Gold, общий пользовательский опыт.

    Многие люди, возможно, удивятся, но этот вопрос неправильный.Если вы слышите этот вопрос во время собеседования, вам нужно помочь интервьюеру понять, в чем тут путаница.

    Начнем с того, что не существует конкретного шаблона, который называется просто «Фабрика».Есть шаблон, который называется «Абстрактная фабрика», и есть шаблон, который называется «Фабричный метод».

    Так что же тогда означает «Фабрика»?одно из следующих (все можно считать правильным, в зависимости от объема ссылки):

    И, к сожалению, Многие люди используют «Фабрику» для обозначения другого типа фабрики, которая создает фабрику или фабрики (или их интерфейсы).Согласно их теории:

    Продукт реализует iProduct, который создается Factory, который реализует ifactory, который создается AbstractFactory.

    Чтобы понять, насколько это глупо, продолжим наше уравнение:

    AbstractFactory реализует IAbstractFactory, созданную...Абстрактная фабрика???

    Надеюсь, вы понимаете суть.Не запутайтесь и, пожалуйста, не выдумывайте того, чего нет по разуму.

    -

    P.S.:Фабрика для продуктов — это AbstractFactory, а Фабрика для абстрактных фабрик — это еще один пример AbstractFactory.

    //Abstract factory - Provides interface to create factory of related products
    interface PizzaIngredientsFactory{    
       public Dough createDough(); //Will return you family of Dough
       public Clam createClam();   //Will return you family of Clam
       public Sauce createSauce(); //Will return you family of Sauce
    }
    
    class NYPizzaIngredientsFactory implements PizzaIngredientsFactory{
    
       @Override
       public Dough createDough(){
          //create the concrete dough instance that NY uses
          return doughInstance;
       }
    
       //override other methods
    } 
    

    Определения учебника уже предоставлены другими ответами. Я думал, что приведу пример этого тоже.

    Итак, здесь PizzaIngredientsFactory является абстрактной фабрикой , поскольку она предоставляет методы для создания семейства связанных продуктов.

    Обратите внимание, что каждый метод в абстрактной фабрике сам по себе является фабричным методом . Например, createDough () сам по себе является фабричным методом, чьи конкретные реализации будут обеспечиваться подклассами, такими как NYPizzaIngredientsFactory . Таким образом, используя это, каждое другое местоположение может создавать экземпляры конкретных ингредиентов, которые принадлежат их местоположению.

    Фабричный метод

      

    Предоставляет экземпляр конкретной реализации

    В примере:
     - createDough () - предоставляет конкретную реализацию для теста. Так что это фабричный метод

    Абстрактная фабрика

      

    Предоставляет интерфейс для создания семейства связанных объектов

    В примере:
      PizzaIngredientsFactory - это абстрактная фабрика, так как она позволяет создавать связанный набор объектов, таких как Dough , Clams , Sauce , Для создания каждого семейства объектов предусмотрен фабричный метод.

    Пример из шаблонов проектирования Head First

    У меня есть несколько моментов, которые я могу предложить, ответив Джона следующим образом:

    Абстрактная фабрика - фабрика фабрик!

    С помощью "фабричного метода" (поскольку просто «Фабрика» неоднозначна), вы создаете реализации ( Lemon , Orange и т. д.) определенного интерфейса, например, IFruit . Эта фабрика может называться CitricFruitFactory .

    Но теперь вы хотите создать другие виды фруктов, которые CitricFruitFactory не может создать. Возможно, код CitricFruitFactory не будет иметь смысла, если вы создадите в нем Strawberry (клубника - это не лимонный фрукт!).

    Таким образом, вы можете создать новую фабрику с именем RedFruitFactory , которая производит Strawberry , Raspberry и т. д.

    Как сказал Джон Феминелла: " С помощью шаблона Abstract Factory вы создаете реализации определенного интерфейса Factory - например, IFruitFactory . Каждый из них знает, как создавать различные виды фруктов. & Quot;

    Такими реализациями IFruitFactory являются CitricFruitFactory и RedFruitFactory !

    Мои источники: StackOverflow , tutorialspoint.com , programmers.stackexchange.com и CodeProject.com . <Ч>

    Factory Method (также называемый Factory ) предназначен для развязки клиента реализации Interface . Для примера у нас есть интерфейс Shape с двумя реализациями Circle и Square . Мы определили фабричный класс с фабричным методом с параметром определителя, таким как Type и новой связанной реализацией интерфейса Shape .

    <Ч>

    Abstract Factory содержит несколько фабричных методов или фабричный интерфейс нескольких реализаций фабрики. В следующем примере у нас есть интерфейс Color с двумя реализациями Red и Yellow . Мы определили интерфейс ShapeColorFactory с двумя RedCircleFactory и YellowSquareFactory . Следующий код для объяснения этой концепции:

    interface ShapeColorFactory
    {
        public Shape getShape();
        public Color getColor();
    }
    
    class RedCircleFactory implements ShapeColorFactory
    {
        @Override
        public Shape getShape() {
            return new Circle();
        }
    
        @Override
        public Color getColor() {
            return new Red();
        }
    }
    class YellowSquareFactory implements ShapeColorFactory
    {
        @Override
        public Shape getShape() {
            return new Square();
        }
    
        @Override
        public Color getColor() {
            return new Yellow();
        }
    } 
    

    Здесь разница между FactoryMethod и AbstractFactory . Factory Method так же просто возвращает конкретный класс интерфейса, а Abstract Factory возвращает factory of factory . Другими словами, Abstract Factory возвращает различные сочетания серии интерфейсов.

    <Ч>

    Надеюсь, мое объяснение будет полезным.

    Основное различие в этих фабриках заключается в том, когда вы хотите делать с фабриками и когда вы хотите их использовать.

    Иногда, когда вы выполняете IOC (инверсия управления, например, инжекция в конструктор), вы знаете, что можете создавать твердые объекты. Как упоминалось в приведенном выше примере фруктов, если вы готовы создавать объекты фруктов, вы можете использовать простой фабричный шаблон .

    Но часто вы не хотите создавать твердые объекты, они появятся позже в потоке программы. Но конфигурация говорит вам, какую фабрику вы хотите использовать при запуске, вместо создания объектов вы можете передавать фабрики, производные от общего класса фабрики, конструктору в IOC.

    Итак, я думаю, что это также касается времени жизни и создания объекта.

    И Фабричный метод , и Abstract Factory позволяют отделить клиентов от конкретных типов. Оба создают объекты, но метод Factory использует наследование, тогда как Abstract Factory использует композицию.

    Factory Method наследуется в подклассах для создания конкретных объектов (продуктов), тогда как Abstract Factory предоставляет интерфейс для создания семейства связанных продуктов, и подкласс этих интерфейсов определяет как создавать сопутствующие товары.

    Затем эти подклассы при создании экземпляра передаются в классы продукта, где он используется как абстрактный тип. Связанные продукты в Abstract Factory часто реализуются с использованием Factory Method .

    Расширяя ответ Джона Феминеллы:

    Apple , Banana , Cherry реализует FruitFactory и имеет метод с именем Create , который несет полную ответственность за создание Apple или Banana или Cherry. Вы закончили с помощью метода Factory .

    Теперь вы хотите создать специальный салат из своих фруктов, и вот вам Абстрактная фабрика . Абстрактная Фабрика знает, как создать свой специальный салат из яблок, бананов и вишни.

    public class Apple implements Fruit, FruitFactory {
        public Fruit Create() {
            // Apple creation logic goes here
        }
    }
    
    public class Banana implements Fruit, FruitFactory {
        public Fruit Create() {
            // Banana creation logic goes here
        }
    }
    
    public class Cherry implements Fruit, FruitFactory {
        public Fruit Create() {
            // Cherry creation logic goes here
        }
    }
    
    public class SpecialSalad implements Salad, SaladFactory {
        public static Salad Create(FruitFactory[] fruits) {
            // loop through the factory and create the fruits.
            // then you're ready to cut and slice your fruits 
            // to create your special salad.
        }
    }
    

    По определению мы можем растянуть различия двух:

    Factory: интерфейс используется для создания объекта, но подкласс решает, какой класс создать. Создание объекта выполняется тогда, когда это требуется.

    Абстрактная фабрика: шаблон Абстрактная фабрика действует как суперфабрика, которая создает другие фабрики. В шаблоне Abstract Factory интерфейс отвечает за создание набора связанных объектов или зависимых объектов без указания их конкретных классов.

    Итак, в приведенных выше определениях мы можем подчеркнуть конкретное различие. то есть шаблон Factory отвечает за создание объектов, а Abstract Factory отвечает за создание набора связанных объектов; очевидно, как через интерфейс.

    Заводской шаблон:

    public interface IFactory{
      void VehicleType(string n);
     }
    
     public class Scooter : IFactory{
      public void VehicleType(string n){
       Console.WriteLine("Vehicle type: " + n);
      }
     }
    
     public class Bike : IFactory{
      public void VehicleType(string n) {
      Console.WriteLine("Vehicle type: " + n);
      }
     }
    
     public interface IVehicleFactory{
      IFactory GetVehicleType(string Vehicle);
     }
    
     public class ConcreteVehicleFactory : IVehicleFactory{
     public IFactory GetVehicleType(string Vehicle){
       switch (Vehicle){
        case "Scooter":
         return new Scooter();
        case "Bike":
         return new Bike();
        default:
        return new Scooter();
      }
     }
    
     class Program{
      static void Main(string[] args){
       IVehicleFactory factory = new ConcreteVehicleFactory();
       IFactory scooter = factory.GetVehicleType("Scooter");
       scooter.VehicleType("Scooter");
    
       IFactory bike = factory.GetVehicleType("Bike");
       bike.VehicleType("Bike");
    
       Console.ReadKey();
     }
    }
    

    Абстрактный шаблон фабрики:

    interface IVehicleFactory{
     IBike GetBike();
     IScooter GetScooter();
    }
    
    class HondaFactory : IVehicleFactory{
         public IBike GetBike(){
                return new FZS();
         }
         public IScooter GetScooter(){
                return new FZscooter();
         }
     }
    class HeroFactory: IVehicleFactory{
          public IBike GetBike(){
                return new Pulsur();
         }
          public IScooter GetScooter(){
                return new PulsurScooter();
         }
    }
    
    interface IBike
        {
            string Name();
        }
    interface IScooter
        {
            string Name();
        }
    
    class FZS:IBike{
       public string Name(){
         return "FZS";
       }
    }
    class Pulsur:IBike{
       public string Name(){
         return "Pulsur";
       }
    }
    
    class FZscooter:IScooter {
      public string Name(){
         return "FZscooter";
       }
    }
    
    class PulsurScooter:IScooter{
      public string Name(){
         return "PulsurScooter";
       }
    }
    
    enum MANUFACTURERS
    {
        HONDA,
        HERO
    }
    
    class VehicleTypeCheck{
            IBike bike;
            IScooter scooter;
            IVehicleFactory factory;
            MANUFACTURERS manu;
    
            public VehicleTypeCheck(MANUFACTURERS m){
                manu = m;
            }
    
            public void CheckProducts()
            {
                switch (manu){
                    case MANUFACTURERS.HONDA:
                        factory = new HondaFactory();
                        break;
                    case MANUFACTURERS.HERO:
                        factory = new HeroFactory();
                        break;
                }
    
          Console.WriteLine("Bike: " + factory.GetBike().Name() + "\nScooter: " +      factory.GetScooter().Name());
            }
      }
    
    class Program
        {
            static void Main(string[] args)
            {
                VehicleTypeCheck chk = new VehicleTypeCheck(MANUFACTURERS.HONDA);
                chk.CheckProducts();
    
                chk= new VehicleTypeCheck(MANUFACTURERS.HERO);
                chk.CheckProducts();
    
                Console.Read();
            }
        }
    

    Проверьте здесь: http://www.allapplabs.com/java_design_patterns/abstract_factory_pattern.htmкажется, что метод Factory использует определенный класс (не абстрактный) в качестве базового класса, тогда как Абстрактная фабрика использует для этого абстрактный класс.Кроме того, если использовать интерфейс вместо абстрактного класса, результатом будет другая реализация шаблона «Абстрактная фабрика».

    :D

    Abstract Factory - это шаблон для создания различных типов интерфейсов. Предположим, у вас есть проект, который требует, чтобы вы анализировали различные типы CSV-файлов, содержащих информацию о количестве, цене и товаре, например, некоторые содержат данные о фруктах, другие о конфетах, а затем после анализа вам нужно обновить эту информацию в соответствующей базе данных, чтобы теперь вы могли иметь одна абстрактная фабрика возвращает вам синтаксический анализатор и фабрику модификаторов, а затем эта фабрика синтаксических анализаторов может возвращать вам объект синтаксического анализатора шоколада, объект анализатора фруктов и т. д., и аналогично фабрика модификаторов может возвращать объект модификатора шоколада, объект модификатора фруктов и т. д.

    Я думаю, что мы можем понять разницу между этими двумя, увидев пример кода Java8:

      interface Something{}
    
      interface OneWhoCanProvideSomething {
         Something getSomething();
      }
    
      interface OneWhoCanProvideCreatorsOfSomething{
         OneWhoCanProvideSomething getCreator();
      }
    
    
    public class AbstractFactoryExample {
    
        public static void main(String[] args) {
            //I need something
            //Let's create one
            Something something = new Something() {};
    
            //Or ask someone (FACTORY pattern)
            OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeA = () -> null;
            OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeB = () -> null;
    
            //Or ask someone who knows soemone who can create something (ABSTRACT FACTORY pattern)
            OneWhoCanProvideCreatorsOfSomething oneWhoCanProvideCreatorsOfSomething = () -> null;
    
            //Same thing, but you don't need to write you own interfaces
            Supplier<Something> supplierOfSomething = () -> null;
            Supplier<Supplier<Something>> supplierOfSupplier = () -> null;
        }
    
    }
    

    Теперь вопрос в том, какой способ создания следует использовать и почему: Первый способ (без шаблона, просто простой конструктор): создание самостоятельно - не очень хорошая идея, вам нужно выполнить всю работу, и ваш клиентский код привязан к конкретной реализации.

    Второй способ (с использованием шаблона Factory): предоставляет вам преимущество, заключающееся в том, что вы можете передать любой тип реализации, который может предоставить другой тип чего-либо в зависимости от некоторого условия (возможно, параметра, переданного в метод создания).

    Третий способ (с использованием шаблона Abstract Factory): это дает вам больше гибкости. Вы можете найти разные типы создателей чего-либо, основываясь на каком-то условии (может быть, передан параметр).

    Обратите внимание, что вы всегда можете обойтись без паттерна Factory, комбинируя вместе два условия (что немного увеличивает сложность кода и связывание), я думаю, поэтому мы редко видим реальные случаи использования паттерна Abstract Factory .

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top