Абстрактная фабрика в языке программирования C++ представляет собой паттерн проектирования, который позволяет создавать семейства связанных объектов без явного указания их конкретных классов. Это достигается путем определения абстрактного базового класса фабрики и абстрактных классов для каждого семейства объектов, которые фабрика будет производить.
Ошибочно считать, что абстрактная фабрика в C++ должна быть полностью независимой от реализации. Вместо этого она должна предоставлять абстрактные интерфейсы для создания объектов, тогда как конкретные реализации интерфейса могут зависеть от конкретной семантики и реализации фабрики.
Вот пример, демонстрирующий создание абстрактной фабрики в C++:
// Абстрактный класс фабрики class AbstractFactory { public: virtual AbstractProductA* CreateProductA() = 0; virtual AbstractProductB* CreateProductB() = 0; }; // Абстрактные классы продуктов class AbstractProductA { public: virtual void DoSomething() = 0; }; class AbstractProductB { public: virtual void DoSomething() = 0; }; // Конкретная реализация фабрики class ConcreteFactory : public AbstractFactory { public: AbstractProductA* CreateProductA() override { return new ConcreteProductA(); } AbstractProductB* CreateProductB() override { return new ConcreteProductB(); } }; // Конкретные классы продуктов class ConcreteProductA : public AbstractProductA { public: void DoSomething() override { // реализация продукта A } }; class ConcreteProductB : public AbstractProductB { public: void DoSomething() override { // реализация продукта B } }; // Использование абстрактной фабрики int main() { AbstractFactory* factory = new ConcreteFactory(); AbstractProductA* productA = factory->CreateProductA(); AbstractProductB* productB = factory->CreateProductB(); productA->DoSomething(); productB->DoSomething(); delete productA; delete productB; delete factory; return 0; }
В приведенном выше коде абстрактный класс AbstractFactory
определяет интерфейсы для создания объектов AbstractProductA
и AbstractProductB
. Конкретная реализация фабрики ConcreteFactory
реализует эти интерфейсы и создает конкретные экземпляры ConcreteProductA
и ConcreteProductB
.
Используя абстрактную фабрику, мы можем создавать объекты семейства продуктов без привязки к их конкретным классам. Это позволяет легко изменять или расширять семейства объектов, добавлять новые продукты или изменять существующие, не изменяя существующий код, который использует фабрику.