В чем основное различие между фабричными и абстрактными фабричными узорами? [закрытый]
в чем основная разница между заводскими и абстрактными заводскими шаблонами?
20 ответов:
с заводским шаблоном вы создаете экземпляры реализаций (
Apple
,Banana
,Cherry
и т. д.) конкретного интерфейса, скажем,IFruit
.С абстрактным шаблоном фабрики, вы обеспечиваете путь для любого обеспечить их собственную фабрику. Это позволяет вашему складу быть либо
IFruitFactory
илиIJuiceFactory
, не требуя, чтобы ваш склад знал что-нибудь о фруктах или соках.
источник этой информации взят из:http://java.dzone.com/news/intro-design-patterns-abstract
абстрактная Фабрика и фабричный метод
методы абстрактной фабрики реализуются как методы фабрики. Как абстрактный шаблон фабрики, так и шаблон метода фабрики отделяют клиентскую систему от фактических классов реализации через абстрактные типы и фабрики. Заводской метод создает объекты через наследование, где абстрактная Фабрика создает объекты через композицию.
абстрактный Заводской шаблон состоит из абстрактного завода, конкретного завода, абстрактного продукта, конкретного продукта и клиента.
как применять
абстрактный Заводской шаблон может быть реализован с использованием шаблона Заводского метода, прототипа или Одноэлементного шаблона. Объект ConcreteFactory может быть реализован как одноэлементный как только один экземпляр Нужен конкретный объект.
шаблон Заводского метода-это упрощенная версия абстрактного Заводского шаблона. Фабричный метод pattern отвечает за создание продуктов, принадлежащих к одному семейству, в то время как абстрактный Фабричный шаблон имеет дело с несколькими семействами продуктов.
метод фабрики использует интерфейсы и абстрактные классы для отделения клиента от класса генератора и результирующих продуктов. Абстрактная фабрика имеет генератор, который является контейнером для нескольких заводские методы, а также интерфейсы, отделяющие клиента от генератора и продуктов.
когда использовать шаблон Заводского метода
используйте шаблон Заводского метода, когда необходимо отделить клиента от конкретного продукта, который он использует. Используйте метод Factory, чтобы освободить клиента от ответственности за создание и настройку экземпляров продукта.
когда использовать абстрактный Заводской шаблон
использовать абстрактные Заводская модель, когда клиенты должны быть отделены от классов продуктов. Особенно полезно для настройки и модификации программы. Абстрактный Фабричный шаблон также может применять ограничения на то, какие классы должны использоваться с другими. Это может быть много работы, чтобы сделать новые бетонные заводы.
примеры:
Абстрактный Завод Пример 1
эта спецификация для дисков для приготовления разных видов макаронных изделий в макароннике находится абстрактная фабрика, а каждый конкретный диск является фабрикой. все фабрики (макаронные диски) наследуют свои свойства от абстрактной фабрики. Каждый отдельный диск содержит информацию о том, как создать пасту, а пасту не.
Абстрактный Завод Пример 2:
Штемпелюя оборудование соответствует к абстрактной фабрике, по мере того как оно интерфейс для операций, создающих абстрактные объекты продукта. Плашки соответствуют к конкретной фабрике, по мере того как они создают бетон товар. Каждая категория части (клобук, дверь, etc.) соответствует абстрактному продукту. Конкретные детали (например, дверь со стороны водителя для 99 camry) соответствует конкретный продукт.
Пример Метода Фабрики:
игрушечная компания соответствует создателю, так как она может использовать фабрику для создания объектов продукта. Подразделение игрушечной компании, которая производит определенный тип игрушки (лошадь или автомобиль), соответствует конкретному создателю.
шаблон фабрики : Завод производит IProduct-реализации
Абстрактный Узор Завод : Завод-фабрика производит Ифак, который в свою очередь производит Ипродукты :)
[обновление в соответствии с комментариями]
То, что я написал ранее, не является правильным в соответствии с Википедия по крайней мере. Абстрактная фабрика-это просто фабричный интерфейс. С его помощью вы можете переключать свои фабрики во время выполнения, чтобы разрешить разные фабрики в разных контексты. Примерами могут быть разные фабрики для разных ОС, поставщики SQL, промежуточное программное обеспечение-драйверы и т. д..
Абстрактный Заводской Шаблон
предоставить интерфейс для создания семьи родственных или зависимых лиц объекты без указания их конкретный класс.
абстрактная картина фабрики очень похож на метод фабрики узор. Одно различие между два - это то, что с абстрактной фабрикой шаблон, класс делегирует ответственность объекта инстанцирование другому объекту через состав в то время как на заводе Метод шаблон использует наследование и полагается на подкласс для обработки желаемый экземпляр объекта.
собственно, делегированный объект часто использует методы фабрики выполните создание экземпляра!
шаблон фабрики
заводские шаблоны являются примерами творческая модель
Creational patterns аннотация процесс создания экземпляра объекта. Они скрыть способ создания объектов и помочь делать общая система независимая как создавать свои объекты и состоящий.
класс creational patterns фокус на использование наследования для решения объект для создания экземпляра Заводской Метод
объект creational patterns фокус на делегирование экземпляра к другому объекту Абстрактная Фабрика
способ завода: у вас есть фабрика, которая создает объекты, производные от определенного базового класса
абстрактная фабрика: у вас есть фабрика, которая создает другие фабрики, и эти фабрики в свою очередь создают объекты, производные от базовых классов. Вы делаете это, потому что вы часто не просто хотите создать один объект (как с заводским методом) - скорее, вы хотите создать коллекцию связанных объектов.
абстрактная фабрика-это интерфейс для создания связанных объектов, но метод фабрики-это метод. Аннотация фабрика реализуется заводским методом.
основные отличия:
Фабрика: создает объекты без предоставления клиенту логики создания экземпляра.
Метод Фабрики: определите интерфейс для создания объекта,но пусть подклассы решают, какой класс создавать. Метод Factory позволяет классу отложить создание экземпляра до подклассов
Абстрактная Фабрика: предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.
AbstractFactory шаблон использует композицию для делегирования ответственности за создание объекта другому классу в то время как метод фабрики шаблон использует наследование и полагается на производный класс или подкласс для создания объекта
С oodesign статьи:
завод класс диаграмма:
Пример: 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 с примером кода:
Шаблон Фабрики. Когда использовать заводские методы?
отличия:
- абстрактные классы фабрики часто реализуются с фабрикой Методы, но они также могут быть реализованы с помощью Prototype
- проекты начинаются с использования Заводского метода (менее сложный, более настраиваемый, подклассы размножаются) и развиваются в направлении других творческих моделей (более гибких, более сложных), где требуется больше гибкости.
- заводские методы обычно вызываются в рамках шаблонных методов.
другие полезные статьи:
factory_method от sourcemaking
abstract_factory от sourcemaking
абстрактный-фабрика-Дизайн-Шаблон из journaldev
пример/сценарий для абстрактной фабрики
Я живу в месте, где идет дождь в сезон дождей, снег зимой и жарко и солнечно летом. Мне нужна другая одежда, чтобы защитить себя от стихии. Для этого я иду в магазин рядом с моим домом и прошу одежду/предметы, чтобы защитить себя. Хранитель магазина дает мне соответствующий предмет в соответствии с окружающей средой и глубиной моего кармана. Предметы, которые он мне дает, имеют одинаковый уровень качества и ценовой диапазон. Поскольку он зная о моих стандартах, ему легко это сделать. Но когда богатый парень с другой стороны улицы приходит с теми же требованиями, он получает дорогой, фирменный предмет. Одна заметная вещь-все предметы, которые он мне дает, дополняют друг друга по качеству, стандарту и стоимости. Можно сказать, что они идут друг с другом. То же самое происходит с предметами, которые получает этот богатый парень.
Так что, глядя На выше сценарий, я теперь ценю эффективность владельца магазина. Я могу заменить этого лавочника с абстрактным магазином. Предметы, которые мы получаем с абстрактными предметами, и я, и богатые, как перспективные клиенты. Все, что нам нужно, это продукт/товар, который соответствует нашим потребностям.
теперь я могу легко увидеть себя считая интернет-магазина, который предоставляет набор услуг для своих многочисленных клиентов. Каждый клиент принадлежит к одной из трех групп. Когда пользователь премиум-группы открывает сайт, он получает отличный пользовательский интерфейс, высоко настроенную рекламную панель, дополнительные параметры в меню и т. д. Этот же набор функций представлены пользователю gold, но функциональность в меню меньше, рекламные объявления в основном релевантны и немного меньше egronomic UI. Последний-это мой вид пользователя, Пользователь "свободной группы". Меня просто обслужили достаточно, чтобы я не обиделся. Интерфейс-это минимум, не отстают настолько, что я не знаю, что в нем, наконец, в меню есть только выход.
Если у меня будет возможность построить что-то вроде этого сайта, я определенно рассмотрю абстрактную фабрику Узор.
Аннотация продукции : панели реклама, меню, пользовательский интерфейс художника.
Абстрактная Фабрика: Пользовательский Опыт Веб-Магазина
Конкретизируйте Фабрику: Наградной Опыт Потребителя, Опыт Потребителя Золота, Общий Опыт Потребителя.
многие люди будут удивлены, может быть, но этот вопрос неправильно. Если вы слышите этот вопрос во время интервью, вам нужно помочь интервьюеру понять, где путаница.
начнем с того, что нет конкретного рисунка, который называется просто "фабрика". Существует шаблон, который называется "абстрактная Фабрика", и есть шаблон, который называется"фабричный метод".
Итак, что же тогда означает "Фабрика"? один из следующих вариантов (все можно считать правильным, в зависимости от объема ссылки):
- некоторые люди используют его как псевдоним (ярлык) для "Абстрактная Фабрика".
- некоторые люди используют его как псевдоним (ярлык) для "Метод Фабрики".
- некоторые люди используют его как более общее название для всех фабрика/творческие узоры. Например, и "абстрактная Фабрика", и "фабричный метод" являются фабриками.
и, к сожалению, много людей используют "фабрику" для того чтобы обозначить другой вид фабрики, которая создает фабрику или фабрики (или их интерфейсы). Основываясь на их теории:
продукт снабжает Ипродукт, который создан фабрикой, которая реализует 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
. Для создания каждого семейства объектов предусмотрен заводской метод.пример Head First design patterns
фабричный метод-это нестатический метод, который возвращает базовый класс или тип интерфейса и который реализован в иерархии для обеспечения полиморфного создания. Фабричный метод должен быть определен / реализован классом и одним или несколькими подклассами класса. Каждый класс и подклассы действуют как фабрики. Однако мы не говорим, что фабричный метод-это фабрика. Абстрактная фабрика-это интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных параметров занятия.
абстрактные фабрики предназначены для замены во время выполнения, поэтому система может быть сконфигурирована для использования конкретного, конкретного исполнителя абстрактной фабрики. Каждая абстрактная фабрика-это фабрика, хотя не каждая фабрика-это абстрактная Фабрика. Классы, которые являются фабриками, а не абстрактными фабриками, иногда развиваются в абстрактные фабрики, когда возникает необходимость поддерживать создание нескольких семейств связанных или зависимых объектов.
у меня есть несколько моментов, чтобы внести свой вклад в ответ Джона следующим образом:
абстрактная фабрика-это фабрика фабрик!
С "фабричным методом" (потому что просто" фабрика " неоднозначна), вы производите реализации (
Lemon
,Orange
и т. д.) конкретного интерфейса, скажем,IFruit
. Эту фабрику можно назватьCitricFruitFactory
.но теперь вы хотите создать другие виды фруктов, которые CitricFruitFactory не в состоянии создать. Может быть, код
CitricFruitFactory
не имеет смысла, если вы создаетеStrawberry
в нем (клубника не цитрусовых!).таким образом, вы можете создать новую фабрику под названием
RedFruitFactory
производитStrawberry
,Raspberry
и т. д.как сказал Джон Феминелла: " С абстрактным шаблоном фабрики, вы производите реализации определенного интерфейса фабрики -- например,
IFruitFactory
. Каждый из них знает, как создавать различные виды фруктов."что implementatios из
IFruitFactory
areCitricFruitFactory
иRedFruitFactory
!
продление Джон 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
) для развязки клиента AInterface
реализация. Для образца у нас есть СCircle
иSquare
реализаций. Мы определяем класс фабрики с помощью метода фабрики с параметром определителя, таким какType
и новая связанная реализация .
Abstract Factory
содержит несколько заводских методов или интерфейс фабрики несколькими реализациями фабрики. Для следующего выше образца у нас естьColor
интерфейс с двумяRed
иYellow
реализаций. Мы должны определить aShapeColorFactory
интерфейс с двумя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.
Итак, я думаю, что его также о жизни объекта и создании.
по определению мы можем растянуть различия двух:
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
использовать композицию.The
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).
третий способ (с использованием абстрактного Заводского шаблона): это дает вам больше гибкости. Вы можете найти разные типы создателей чего-то, основанные на каком-то условии (возможно, переданном параметре).
обратите внимание, что вы всегда можете уйти с заводским шаблоном, объединив два условия вместе (что немного увеличивает код сложность и сцепление), я думаю, именно поэтому мы редко видим реальные случаи использования абстрактного фабричного шаблона.