抽象工厂(Abstract Factory)是一种创建对象的设计模式,它提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂允许客户端通过接口与具体工厂进行交互,而不是直接与具体产品进行交互。
以下是抽象工厂模式的几个关键角色:
-
抽象工厂(Abstract Factory):定义了创建一系列相关产品的接口。它通常是一个抽象类或接口,其中包含了一组抽象方法,用于创建不同类型的产品对象。
-
具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建具体产品对象的工厂类。每个具体工厂实现了抽象工厂定义的方法,根据需要创建具体的产品对象。
-
抽象产品(Abstract Product):定义了一组产品的接口,该接口声明了产品的通用方法。抽象产品可以是一个抽象类或接口。
-
具体产品(Concrete Product):实现了抽象产品定义的接口,具体产品是抽象产品的实际实现。每个具体产品类对应一个具体工厂类。
抽象工厂模式的主要目的是提供一个统一的接口,使得客户端代码能够与具体工厂解耦,并且能够创建一系列相关的产品对象。通过使用抽象工厂,可以更容易地切换和替换不同的产品族,而无需修改客户端代码。
以下是一个简单的示例,演示了如何使用抽象工厂模式:
// 抽象产品 A
class AbstractProductA {
public:
virtual void performOperationA() = 0;
};
// 具体产品 A1
class ConcreteProductA1 : public AbstractProductA {
public:
void performOperationA() override {
// 具体产品 A1 的操作实现
}
};
// 具体产品 A2
class ConcreteProductA2 : public AbstractProductA {
public:
void performOperationA() override {
// 具体产品 A2 的操作实现
}
};
// 抽象产品 B
class AbstractProductB {
public:
virtual void performOperationB() = 0;
};
// 具体产品 B1
class ConcreteProductB1 : public AbstractProductB {
public:
void performOperationB() override {
// 具体产品 B1 的操作实现
}
};
// 具体产品 B2
class ConcreteProductB2 : public AbstractProductB {
public:
void performOperationB() override {
// 具体产品 B2 的操作实现
}
};
// 抽象工厂
class AbstractFactory {
public:
virtual AbstractProductA* createProductA() = 0;
virtual AbstractProductB* createProductB() = 0;
};
// 具体工厂 1
class ConcreteFactory1 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA1();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB1();
}
};
// 具体工厂 2
class ConcreteFactory2 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA2();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB2();
}
};
int main() {
// 使用具体工厂 1 创建产品 A1 和 B1
AbstractFactory* factory1 = new ConcreteFactory1();
AbstractProductA* productA1 = factory1->createProductA();
AbstractProductB* productB1 = factory1->createProductB();
// 使用具体工厂 2 创建产品 A2 和 B2
AbstractFactory* factory2 = new ConcreteFactory2();
AbstractProductA* productA2 = factory2->createProductA();
AbstractProductB* productB2 = factory2->createProductB();
// 使用产品进行操作
productA1->performOperationA();
productB1->performOperationB();
productA2->performOperationA();
productB2->performOperationB();
// 释放资源
delete productA1;
delete productB1;
delete productA2;
delete productB2;
delete factory1;
delete factory2;
return 0;
}
在上述示例中,抽象产品类(AbstractProductA 和 AbstractProductB)定义了产品的通用方法。具体产品类(ConcreteProductA1、ConcreteProductA2、ConcreteProductB1 和 ConcreteProductB2)继承自抽象产品类,并实现了具体的产品操作。
抽象工厂类(AbstractFactory)定义了创建产品的接口,具体工厂类(ConcreteFactory1 和 ConcreteFactory2)实现了抽象工厂接口,并根据需要创建具体的产品对象。
在主函数中,我们使用具体工厂来创建具体的产品对象,并使用这些产品对象进行操作。
通过抽象工厂模式,我们可以在客户端代码中使用抽象工厂和抽象产品,而不需要直接与具体工厂和具体产品进行交互,从而实现了解耦和灵活的对象创建。