В чем основное различие между фабричными и абстрактными фабричными шаблонами? [закрытый]

в чем основная разница между заводскими и абстрактными заводскими шаблонами?

20 ответов


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

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


источник этой информации взят из:http://java.dzone.com/news/intro-design-patterns-abstract

абстрактная Фабрика и фабричный метод

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

абстрактный шаблон фабрики состоит из AbstractFactory, ConcreteFactory, AbstractProduct, ConcreteProduct и клиента.

как применять

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

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

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

когда использовать шаблон Заводского метода

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

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

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

примеры:

Абстрактный Завод Пример 1

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

Абстрактный Завод Пример 2:

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

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

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


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

Абстрактный Узор Завод : Фабрика-фабрика производит IFactories, который в свою очередь производит IProducts :)

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


Абстрактный Заводской Шаблон

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

  • абстрактный узор завод подобно Заводскому методу узор. Одно различие между два - это то, что с абстрактной фабрикой pattern, класс делегирует ответственность объекта инстанцирование другому объекту через состав тогда как фабрика Метод шаблон использует наследование и полагается на подкласс для обработки создание экземпляра желаемого объекта.

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

шаблон фабрики

  • образцы фабрики примеры creational patterns

  • Creational шаблоны абстрактные процесс создания экземпляра объекта. Они скрыть способ создания объектов и помощь делать общая независимая система как создавать свои объекты и состоящий.

  • класс creational шаблоны сосредоточиться на использование наследования решать объект для создания экземпляра Заводской Метод

  • объект creational шаблоны сосредоточиться на делегация инстанцировании к другому объекту Абстрактная Фабрика

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


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

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


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

enter image description here


основные отличия:

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

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

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

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

С oodesign статьи:

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

enter image description here

Пример: 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:

enter image description here

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

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

enter image description here

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

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

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

Шаблон Фабрики. Когда использовать заводские методы?

отличия:

  1. абстрактные заводские классы часто реализуются с помощью Factory Методы, но они также могут быть реализованы с помощью Prototype
  2. конструкции начинают вне используя метод фабрики (более менее осложненный, более ориентированный на заказчика, подклассы пролиферируют) и эволюционируют к другим creational картинам (более гибким, более сложным) где больше гибкости необходимо.
  3. заводские методы обычно вызываются в рамках методов шаблона.

другие полезные статьи:

factory_method от sourcemaking

abstract_factory от sourcemaking

абстрактный-завод-Дизайн-Шаблон из journaldev


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

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

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

теперь я могу легко представить себя рассматривающим интернет-магазин, который предоставляет набор услуг своим многочисленным клиентам. Каждый клиент принадлежит к одной из трех групп. Когда пользователь премиум-группы открывает сайт, он получает отличный пользовательский интерфейс, настраиваемую панель рекламы, дополнительные параметры в меню и т. д. Этот же набор функций представлены пользователю gold, но функциональность в меню меньше, реклама в основном релевантна и немного меньше egronomic UI. Последний-мой пользователь, пользователь "свободной группы". Мне просто подают достаточно, чтобы я не обиделся. Интерфейс-это минимум, не отстают настолько, что я не знаю, что в нем, наконец, в меню есть только выход.

Если я получу шанс построить что-то вроде этого веб-сайта, я обязательно рассмотрю абстрактную фабрику Узор.

абстрактные продукты: панель рекламы, меню, художник пользовательского интерфейса.
Абстрактная Фабрика: Веб-Магазин Пользовательский Опыт
Конкретизируйте Фабрику: Наградной Опыт Потребителя, Опыт Потребителя Золота, Общий Опыт Потребителя.


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

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

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

  • некоторые люди используют его как псевдоним (ярлык) для "Абстрактная Фабрика".
  • некоторые люди используют его как псевдоним (ярлык) для "Метод Фабрики".
  • некоторые люди используют его как более общее имя для всех фабричных / творческих моделей. Е. Г. как "абстрактная Фабрика" и "фабричный метод" - заводы.

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

продукт реализует IProduct, который создается фабрикой, которая реализует IFactory, который создается AbstractFactory.

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

AbstractFactory реализует IAbstractFactory, который создано... AbstractAbstractFactory???

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

-

П. С.: фабрика для продуктов 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. Для создания каждого семейства объектов он предоставляет заводской метод.

пример Глава первая шаблоны проектирования


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

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


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

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

с "заводским методом" (потому что просто" фабрика " неоднозначна) вы производите реализации (Lemon, Orange, etc.) определенного интерфейса-скажем,IFruit. Эту фабрику можно назвать CitricFruitFactory.

но теперь вы хотите создать другие виды фруктов, которые CitricFruitFactory не в состоянии создать. Может быть, кодекс CitricFruitFactory не имеет смысла, если вы создаете Strawberry в нем (клубника не цитрусовых!).

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

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

что implementatios из IFruitFactory are CitricFruitFactory и RedFruitFactory!


расширение John Feminella ответ:

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

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

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.
    }
}

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


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


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 возврат различных комбайнов a серия интерфейса.


я надеюсь, что мое объяснение пригодится.


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

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

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

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


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

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

: D


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

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

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


абстрактная Фабрика шаблон для создания различных типов интерфейсов. Предположим, у вас есть проект, который требует от вас, чтобы проанализировать различные типы файлов 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;
    }

}

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

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

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

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