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

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

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

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

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

Абстрактный завод по сравнению с заводским методом

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

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

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

Шаблон Abstract Factory можно реализовать с использованием шаблона Factory Method, Prototype Pattern или Singleton Pattern. Объект ConcreteFactory может быть реализован как Singleton, так как требуется только один экземпляр объекта ConcreteFactory.

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

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

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

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

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

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

Примеры:

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

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

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

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

Пример фабричного метода:

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

Заводская схема: завод производит IProduct-реализации

Аннотация Заводская модель: заводская фабрика производит IFactories, которая, в свою очередь, производит IProducts 🙂

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

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

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

  • Шаблон Abstract Factory очень похож на шаблон Factory Method. Одна разница между ними заключается в том, что с шаблоном Abstract Factory class делегирует ответственность за экземпляр объекта на другой объект посредством композиции, тогда как шаблон Factory Method использует наследование и полагается на подclass для обработки требуемого экземпляра объекта.

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

Заводская модель

  • Фабричные шаблоны являются примерами шаблонов создания

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

  • Классовые шаблоны создания сосредотачиваются на использовании наследования, чтобы решить, какой объект будет создан.

  • Шаблоны создания объектов фокусируются на делегировании экземпляра на другой объект. Абстрактная фабрика

Ссылка: Factory vs Abstract Factory

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

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

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

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

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

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

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

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

AbstractFactory pattern использует состав, чтобы делегировать ответственность за создание объекта другому classу, в то время как шаблон Factory method использует наследование и полагается на производный class или подclass для создания объекта

Из статей oodesign :

Диаграмма рабочего classа:

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

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

Шаблоны проектирования: Factory vs Factory method vs Abstract Factory

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

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

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

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

Абстрактная диаграмма рабочего classа от dzone

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

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

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

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

Заводской шаблон. Когда использовать заводские методы?

Отличия:

  1. Абстрактные classы Factory часто реализуются с помощью Factory Methods, но они также могут быть реализованы с использованием Prototype
  2. Проекты начинаются с использования Factory Method (менее сложные, настраиваемые, подclassы размножаются) и развиваются по отношению к другим шаблонам создания (более гибкие, более сложные), где требуется больше гибкости.
  3. Фабричные методы обычно вызываются в шаблонных методах.

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

factory_method from sourcemaking

abstract_factory from sourcemaking

абстрактно-завод-дизайн-шаблон от журнала

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

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

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

Теперь я легко вижу, что я рассматриваю интернет-магазин, который предоставляет множество услуг своим многочисленным клиентам. Каждый клиент принадлежит к одной из трех групп. Когда пользователь группы премиум-classа открывает сайт, он получает отличный пользовательский интерфейс, настраиваемую рекламную панель, больше параметров в меню и т. Д. Этот же набор функций представлен золотому пользователю, но функциональность в меню меньше, реклама в основном актуальна, и чуть менее эгономичный пользовательский интерфейс. Последний мой пользователь, пользователь «свободной группы». Мне просто достаточно, чтобы я не обижался. Пользовательский интерфейс является минимальным, рекламные объявления так далеко от трека, что я не знаю, что в нем происходит, наконец, меню выходит из системы.

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

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

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

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

Заводской метод

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

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

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

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

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

Пример из шаблонов Head First

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

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

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

  • Некоторые используют его как псевдоним (ярлык) для « Абстрактной фабрики ».
  • Некоторые используют его как псевдоним (ярлык) для « Factory Method ».
  • Некоторые используют его как более общее имя для всех шаблонов фабрики / создания. Например, как «Абстрактная фабрика», так и «Фабричный метод» – это фабрики.

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

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

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

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

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

PS : Factory for Products – AbstractFactory, а Factory for Abstract Factory – еще один пример AbstractFactory.

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

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

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

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

С «Factory Method» (потому что просто «Factory» неоднозначно) вы производите реализации ( Lemon , Orange и т. Д.) IFruit интерфейса – скажем, IFruit . Этот завод можно назвать CitricFruitFactory .

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

Таким образом, вы можете создать новый завод под названием RedFruitFactory который производит RedFruitFactory , Raspberry и т. Д.

Как сказал Джон Фэминелла: «С шаблоном Abstract Factory вы создаете реализации конкретного интерфейса Factory – например, IFruitFactory . Каждый из них знает, как создавать разные виды фруктов».

Эта реализация IFruitFactoryCitricFruitFactory и RedFruitFactory !

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

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

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

 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 , CodeProject.com и CodeProject.com .


Factory Method (также называемый Factory ) предназначен для развязки клиента реализации Interface . Для образца у нас есть интерфейс Shape с двумя реализациями Circle и Square . Мы определили фабричный class с заводским методом с параметром определения, таким как 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 просто возвращает конкретный class интерфейса, но Abstract Factory возвращает factory of factory . Другими словами, Abstract Factory возвращает другой комбинат серии интерфейсов.


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

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

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

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

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

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

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

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

Итак, в приведенных выше определениях мы можем подчеркнуть конкретную разницу. то есть 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(); } } 

Аннотация Завод Pattern:

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

: D

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

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

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

Абстрактная фабрика – это шаблон для создания различных типов интерфейсов. Предположим, у вас есть проект, который требует от вас parsingа различных типов файлов csv, содержащих информацию о количестве, цене и деталях, например, некоторые содержат данные о плодах, других о конфетах, а затем после parsingа вам необходимо обновить эту информацию в соответствующей базе данных, чтобы теперь вы могли одна абстрактная фабрика, возвращающая вам парсер и фабрику модификаторов, а затем эта фабрика парсера может вернуть вам объект парсера Шоколада, объект Parser Fruit и т. д., а также модификатор Factory может вернуть объект модификатора шоколада, объект модификатора фруктов и т. д.

Я думаю, мы можем понять разницу между этими двумя, увидев пример кода 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 supplierOfSomething = () -> null; Supplier> supplierOfSupplier = () -> null; } } 

Now the question is which way of creation should you use and why: The first way (no pattern, just plain constructor): creating by yourself is not a good idea, you have to do all the work, and your client code is tied to the particular implementation.

The second way (using Factory pattern): provides you the benefit that you can pass any type of implementation, which can provide different type of something based on some condition (maybe a parameter passed to creational method).

The third way (using Abstract Factory pattern): This gives you more flexibility. You can find different types of creators of something based on some condition (maybe a parameter passed).

Note that you can always get away with Factory pattern by combining two conditions together (which slightly increases code complexity, and coupling), I guess that’s why we rarely see real life use cases of Abstract Factory pattern.

Давайте будем гением компьютера.