Паттерн Абстрактная фабрика (Abstract Factory)…

Паттерн Абстрактная фабрика (также известен как Kit(инструментарий)) - предоставляет интерфейс для создания семейств, связанных между собой, или независимых объектов, конкретные классы которых неизвестны. Паттерн относится к порождающим, так как связан с процессом создания объектов.

Рассмотрим UML диаграмму шаблона:

abstract_factory_main_uml

Рассмотрим диаграмму на примере проектирования программы “Мир животных”, в которой мы хотим “упорядочить” всех животных живущих в Европе и Африке:

AbstractFactory (фабрика Континентов) - объявляет интерфейс для операций, создающих абстрактные объекты-продукты;

ConcreteFactory (фабрика для Африки, фабрика для Европы) - конкретная фабрика. Реализует операции, создающие конкретные объекты-продукты;

AbstractProduct (Хищник, Травоядный) - абстрактный продукт. Объявляет интерфейс для типа объекта-продукта;

Product (Лев, Волк, Бизон, Медведь) - конкретный продукт. Определяет объект-продукт, создаваемый соответствующей конкретной фабрикой. Реализует интерфейс Abstract Product;

Client (Мир животных(приложение)) - клиент. Пользуется исключительно интерфейсами, которые объявлены в классах AbstractFactory и AbstractProduct.

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

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

Вот некоторые проблемы которые помогает решать этот паттерн:

- Задание имени класса привязывает вас к конкретной реализации, а не к конкретному интерфейсу. Это может осложнить изменение объекта в будущем. Чтобы уйти от такой проблемы, создавайте объекты косвенно.
- Уход от аппаратной и программной зависимости
- Если клиент «знает», как объект представлен, хранится или реализован, то при изменении объекта может оказаться необходимым изменить и клиента. Сокрытие этой информации от клиентов поможет уберечься от каскада изменений.
- Уход от сильной связанности

Подробней читайте у GoF, а я перехожу к различным реализациям паттерна Абстрактная фабрика на C#:

1. Abstract Factory - реализация того самого примера с животными(+реализация из русской википедии), собственно говоря я и ориентировался на этот материал.

2. Abstract factory pattern - en-версия из Wiki. Наглядный пример того, как можно заюзать паттерн для какой-либо функции в Win-программе (или кроссплатформенной как в примере). UML:

Abstract

3. Creational Patterns: Writing Abstract Factory pattern with c# - немного кривая реализация, но реально показывающая как можно применить паттерн для возможности легко выбирать БД (переносимость). В качестве Абстрактных фабрик применяются интерфейсы.

4. Abstract Factory - интересная реализация, показывающая возможность создавать несколько “частей” Win-приложения.

File iconAbstract_Factory_Pattern.rar (65 К) реализации (1-4)

5. Pattern : Abstract Factory Creational Pattern - прекрасная UML диаграмма и пример того, какие удобные возможности предоставляет фабрика для создания фигур различного цвета.

6. The Abstract Factory Pattern - еще один прекрасный пример с такой диаграммой:

AbstractFactory

7. Паттерн разработки Abstract Factory - самая богатая коллекция различных подходов (с точки зрения C#) реализаций паттерна. Также рассматриваются решения некоторых проблем, возникающих при использовании паттерна.

8. .NET Abstract Factory - 5 примеров реализаций с кодом и UML… круче только несколько логотипов МТС.

Паттерн Команда (Command)…

Паттерн Команда (также известен как Action(действие) или Transaction(транзакция)) - инкапсулирует запрос в виде объекта, позволяя тем самым параметризовывать клиентов типом запроса, устанавливать очередность запросов, протоколировать их и поддерживать отмену выполнения операций. Это определние из книги Банды Четырех (GoF). Этот паттерн относится к паттернам поведения (то есть характеризует то, как объекты или классы взаимодействуют между собой) и если говорить о нем в целом, то главным его предназначением является избежание зависимости от конкретных операций и “ослабление” связей между классами для улучшения гибкости системы.

Рассмотрим UML диаграмму шаблона:

Command0

Command - объявляет интерфейс для выполнения операции.

ConcreteCommand (Копировать, Вставить) - конкретная команда: определяет связь между объектом-получателем Receiver и действием; реализует операцию Execute путем вызова соответствующих операций объекта Receiver.

Client (Приложение) - клиент: создает объект класса ConcreteCommand и устанавливает его получателя.

Invoker (Пункт меню) - инициатор: обращается к команде для выполнения запроса.

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

Более подробно читайте у GoF, я же приведу несколько примеров реализации на С#:

1. Command Design Pattern in C# and VB.NET - этот же пример приводится и в Wiki (en-версия). Абстрактный класс Command объявляет 2 метода: Execute(), Unexecute(). Класс-наследник CalculatorCommand реализует эти базовые методы. “Общение” происходит между User (Invoker), в котором реализованы методы Отмены, Восстановления и Вычисления и Calculator (Reciever), в котором в методе Operation(…) создаются объекты CalculatorCommand.

UML диаграмма:

wiki_uml_small

В итоге, клиентское приложение (наша консоль или окно) создает экземпляр User и начинает обрабатывать поступающие команды (Compute, Undo, Redo). При этом выполнение команд происходит не в самих методах класса, а передается в виде объектов типа CalculatorCommand на выполнение (в методы Execute() и UnExecute()). В свою очередь выполнение происходит в методе Operation()класса Calculator, который выполняет операции. Таким образом взаимодействие между вызывающим классом (User) и получаетелем (Calculator), происходит посредством CalculatorCommand, что дает нам возможность добавлять новые команды, не изменяя никакие существующие классы, а также расширять функционал самой команды.

2. Сопрограммы, Паттерн “Команда”, C# - реализация от valker. Подробней читайте у него на блоге, я же приведу UML диаграмму его реализации:

valker_uml_small

3. Command Design Pattern in C# 2.0 - реализация, построенная на использовании generic’ов:

uml_generic_small

4. Design Patterns: Command Pattern - одна глав из книги. В принципе ничем особенным не отличается от первой реализации.

File iconCommand_Pattern.rar (58 K) реализации (1-4)

5. Использование паттерна “Команда” - самая лучшая статья из всех. Не хватает только UML. Показан пример создания win-меню на основе паттерна.

6. Command - реализация похожая на 1-ую.

7. Расширение возможностей паттерна Command - тоже отличная статья, только код уже на Delphi.

Изучаем паттерны проектирования…

На самом деле я немного поспешил, сначала рассказав о паттернах на C#, а потом о UML. В сети очень много ресурсов на тему шаблонов проектирования, которые помогут Вас понять зачем и для чего нужны паттерны. Так что, если возникают вопросы или недопонимания прошу пользоваться:

по-русски:

коллекция будет пополняться…

И еще нашел классификацию паттернов, смахивающую на таблицу Менделеева (не понял только что означают номера?):

GoF_full_medium

…а музыка была: Розенбаум - Монолог пилота “Черного тюльпана”

Blogus tags : ,,

del.icio.us Tags: ,

Technorati Tags: ,

Учим UML…

Перед началом изучения паттернов, да и не только, любому кодеру не мешало бы знать UML на уровне большем чем “А я знаю как это расшифровывается”. Подумав, что ссылки будут полезней, чем моя болтовня по этой теме, переходим к первым:

1. Курс на intuit’е

2. uml2.ru

3. IT Manager’s Journal — Introduction to UML

4. http://uml.org

5. uml.ru

6. Отличный мануал с КодПроджекта

7. Полезная мини-шпаргалка

8. в Wiki

update 1/10/2007:

9. swik.net/UML - отличная подборка, куда и я попал -)

Чтобы понять историю UML, лучше смотреть на картинку (правда и картинку уже пора сделать историей):

umlhist

Книги тоже бессмысленно перечислять: Буч, Фаулер, Ларман - в библиотеке подскажут. Еще нашёл такую шпору:

quick_uml_notation

Из инструментов вполне сойдет Visio, Enterprise Architech или Rational Rose. Удачи!

PS (чем юзер отличается от пользователя или правда жизни): тем, что юзер жмет на Пуск правой кнопкой и заходит в Проводник, а у пользователя стоит TotalCommander smile_regular

…а музыка была: ДДТ - Расстреляли Рассветами

Blogus tags : ,,

del.icio.us Tags: , ,

Technorati Tags: , ,