Проблема
| Какой класс должен обеспечивать реализацию паттернов "Высокое зацепление" 3.2.13, и "Низкая связанность" 3.1.7?
|
Решение
| Присвоить группу обязанностей с высокой степенью зацепления классу, который не представляет конкретного понятия из предметной области (синтезировать искусственную сущность для обеспечения высокого зацепления и слабого связывания).
|
Пример
| См. пример паттерна "Информационный эксперт" 3.1.4. Какой класс должен сохранять экземпляры класса "Продажа" в реляционной базе данных? Если возложить эту обязанность на класс "Продажа", то будем иметь низкую степень зацепления и высокую степень связывания (поскольку класс "Продажа" должен быть связан с интерфейсом реляционной базы данных. Хранение обьектов в реляционной базе данных - это общая задача, которую придется решать для многих классов. Решением данной проблемы будет создание нового класса "ПостоянноеХранилище", ответственного за сохранение обьектов некоторого вида в базе данных.
|
Преимущества
| Класс "ПостоянноеХранилище" будет обладать низкой степенью связывания и высокой степенью зацепления.
|
Недостатки
| Данным паттерном не следует злоупотреблять иначе все функции системы превратятся в объекты.
|
Перенаправление (Indirection) - GRASP
Проблема
| Как перераспределить обязанности обьектов, чтобы обеспечить отсутствие прямого связывания?
|
Решение
| Присвоить обязанности по обеспечению связи между службами или компонентами промежуточному объекту.
|
Пример
| См. пример к паттерну "Искусственный" 3.2.16. Класс "Хранилище" выступает в роли промежуточного звена между классом "Продажа" и базой данных.
|
Порождающие паттерны проектирования
Абстрактная фабрика (Abstract Factory, Factory), др. название Инструментарий (Kit) - GoF
Проблема
| Создать семейство взаимосвязанных или взаимозависимых обьектов (не специфицируя их конкретных классов).
|
Решение
| Создать абстрактный класс, в котором объявлен интерфейс для создания конкретных классов.
|
Пример
| Какой класс должен отвечать за создание обьектов - адаптеров при использовании паттерна "Адаптер", см. 3.1.1. Если подобные объекты создаются неким объектом уровня предметной области, то будет нарушен принцип разделения обязанностей.
|
Преимущества
| Изолирует конкретные классы. Поскольку "Абстрактная фабрика" инкапсулирует ответственность за создание классов и сам процесс их создания, то она изолирует клиента от деталей реализации классов. Упрощена замена "Абстрактной фабрики", поскольку она используется в приложении только один раз при инстанцировании.
|
Недостатки
| Интерфейс "Абстрактной фабрики" фиксирует набор обьектов, которые можно создать. Расширение "Абстрактной фабрики" для изготовления новых обьектов часто затруднительно.
|