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