Паттерн Абстрактная фабрика (Abstract Factory)…
Ноябрь 8, 2007 — seregaborzovПаттерн Абстрактная фабрика (также известен как Kit(инструментарий)) - предоставляет интерфейс для создания семейств, связанных между собой, или независимых объектов, конкретные классы которых неизвестны. Паттерн относится к порождающим, так как связан с процессом создания объектов.
Рассмотрим UML диаграмму шаблона:
Рассмотрим диаграмму на примере проектирования программы “Мир животных”, в которой мы хотим “упорядочить” всех животных живущих в Европе и Африке:
AbstractFactory (фабрика Континентов) - объявляет интерфейс для операций, создающих абстрактные объекты-продукты;
ConcreteFactory (фабрика для Африки, фабрика для Европы) - конкретная фабрика. Реализует операции, создающие конкретные объекты-продукты;
AbstractProduct (Хищник, Травоядный) - абстрактный продукт. Объявляет интерфейс для типа объекта-продукта;
Product (Лев, Волк, Бизон, Медведь) - конкретный продукт. Определяет объект-продукт, создаваемый соответствующей конкретной фабрикой. Реализует интерфейс Abstract Product;
Client (Мир животных(приложение)) - клиент. Пользуется исключительно интерфейсами, которые объявлены в классах AbstractFactory и AbstractProduct.
Таким образом в проектируемой программе, создавая(инстанцируя) конкретную фабрику (к примеру для Европы), мы можем создавать семейство объектов с похожим поведением (Волк - хищник, живущий в Восточной Европе или Заяц - травоядный с ценным мехом). При этом созданием объектов-продуктов занимается непосредственно сама фабрика, поэтому нам нужен только ее один экземпляр. Зацитирую бандитов:
Фабрики и их продукция - вот ключевые участники паттерна абстрактная фабрика. Этот паттерн может создавать семейства объектов, не инстанцируя классы явно. Применять его лучше всего, когда число и общий вид изготавливаемых объектов остаются постоянными, но между конкретными семействами продуктов имеются различия. Выбор того или иного семейства осуществляется путем инстанцирования конкретной фабрики, после чего она используется для создания всех объектов. Подставив вместо одной фабрики другую, мы можем заменить все семейство объектов целиком. В паттерне абстрактная фабрика акцент делается на создании семейств объектов, и это отличает его от других порождающих паттернов, создающих только один какой-то вид объектов.
Вот некоторые проблемы которые помогает решать этот паттерн:
- Задание имени класса привязывает вас к конкретной реализации, а не к конкретному интерфейсу. Это может осложнить изменение объекта в будущем. Чтобы уйти от такой проблемы, создавайте объекты косвенно.
- Уход от аппаратной и программной зависимости
- Если клиент «знает», как объект представлен, хранится или реализован, то при изменении объекта может оказаться необходимым изменить и клиента. Сокрытие этой информации от клиентов поможет уберечься от каскада изменений.
- Уход от сильной связанности
Подробней читайте у GoF, а я перехожу к различным реализациям паттерна Абстрактная фабрика на C#:
1. Abstract Factory - реализация того самого примера с животными(+реализация из русской википедии), собственно говоря я и ориентировался на этот материал.
2. Abstract factory pattern - en-версия из Wiki. Наглядный пример того, как можно заюзать паттерн для какой-либо функции в Win-программе (или кроссплатформенной как в примере). UML:
3. Creational Patterns: Writing Abstract Factory pattern with c# - немного кривая реализация, но реально показывающая как можно применить паттерн для возможности легко выбирать БД (переносимость). В качестве Абстрактных фабрик применяются интерфейсы.
4. Abstract Factory - интересная реализация, показывающая возможность создавать несколько “частей” Win-приложения.
Abstract_Factory_Pattern.rar (65 К) реализации (1-4)
5. Pattern : Abstract Factory Creational Pattern - прекрасная UML диаграмма и пример того, какие удобные возможности предоставляет фабрика для создания фигур различного цвета.
6. The Abstract Factory Pattern - еще один прекрасный пример с такой диаграммой:
7. Паттерн разработки Abstract Factory - самая богатая коллекция различных подходов (с точки зрения C#) реализаций паттерна. Также рассматриваются решения некоторых проблем, возникающих при использовании паттерна.
8. .NET Abstract Factory - 5 примеров реализаций с кодом и UML… круче только несколько логотипов МТС.








