printПорождающие паттерны

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

Abstract Factory

Назначение
Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Результаты
1. Имена классов изготавливаемых объектов известны только конкретной фабрике, в коде клиента они не упоминаются. Клиент манипулируют объектами через их абстрактные интерфейсы.
2. Класс конкретной фабрики появляется в приложении только один раз при её создании. Это облегчает замену используемой приложением конкретной фабрики и семейства используемых продуктов.
3. Паттерн гарантирует сочетаемость создаваемых продуктов семейства.

Структура
11746.png

Реализация
// абстрактные продукты
class ProductA {};
class ProductB {};
// Абстрактная фабрика - содержит методы для создания абстрактных объектов-продуктов
class AbstractFactory {
public:
  virtual ProductA *CreateProductA()=0;
  virtual ProductB *CreateProductB()=0;
};
// Конкретные продукты 1-го семейства
class ProductA1:public ProductA {};
class ProductB1:public ProductB {};
// Конкретная фабрика для создания продуктов 1-го семейства
class Factory1: public AbstractFactory {
public:
  ProductA1 *CreateProductA() { return new ProductA1(); }
  ProductB1 *CreateProductB() { return new ProductB1(); }
};
// Конкретные продукты 2-го семейства
class ProductA2:public ProductA {};
class ProductB2:public ProductB {};
// Конкретная фабрика для создания продуктов 1-го семейства
class Factory2: public AbstractFactory {
public:
  ProductA2 *CreateProductA() { return new ProductA2(); }
  ProductB2 *CreateProductB() { return new ProductB2(); }
};
// Создание фабрики
AbstractFactory *factory=new Factory1();
...
// Создание объектов в клиенте
ProductA *a=factory->CreateProductA();
loading