【抽象工厂模式】是设计模式中的一种,它是工厂方法模式的扩展,主要解决在面对复杂的对象创建过程时,如何避免因产品族的增加而导致工厂类的膨胀,以及提高代码的可维护性和灵活性。抽象工厂模式定义了一个创建一系列相关或相互依赖对象的接口,而不必指定它们的具体类。
在描述的问题中,假设有一个显示器电路板厂商,起初有两家工厂A和B,分别生产非液晶和液晶显示器电路板。随着业务发展,厂商决定生产完整的显示器,这就需要另外两家工厂C和D来生产显示器的其余部分。在这种情况下,如果按照传统的工厂方法模式,就需要新增两家工厂,导致管理成本上升。但通过抽象工厂模式,可以将工厂A和B扩展,添加新的生产线来生产剩余部件,既减少了管理成本,又利用了已有技术资源。
抽象工厂模式的UML类图通常包含以下几个部分:
1. 抽象工厂(Abstract Factory):定义一个创建对象的接口,但不指定具体的实现。
2. 具体工厂(Concrete Factory):实现抽象工厂定义的接口,负责创建具体的产品对象。
3. 抽象产品(Abstract Product):定义了产品的接口,即产品家族中的公共部分。
4. 具体产品(Concrete Product):实现了抽象产品的接口,是具体工厂创建的对象。
在代码实现中,通常会有如下结构:
```cpp
// 抽象产品A
class ProductA {
public:
virtual void Show() = 0;
};
// 抽象产品B
class ProductB {
public:
virtual void Show() = 0;
};
// 具体产品A1、A2
class ProductA1 : public ProductA;
class ProductA2 : public ProductA;
// 具体产品B1、B2
class ProductB1 : public ProductB;
class ProductB2 : public ProductB;
// 抽象工厂
class AbstractFactory {
public:
virtual ProductA* CreateProductA() = 0;
virtual ProductB* CreateProductB() = 0;
};
// 具体工厂1
class ConcreteFactory1 : public AbstractFactory {
public:
ProductA* CreateProductA() override { return new ProductA1(); }
ProductB* CreateProductB() override { return new ProductB1(); }
};
// 具体工厂2
class ConcreteFactory2 : public AbstractFactory {
public:
ProductA* CreateProductA() override { return new ProductA2(); }
ProductB* CreateProductB() override { return new ProductB2(); }
};
```
在这个例子中,`AbstractFactory`定义了创建产品A和B的接口,`ConcreteFactory1`和`ConcreteFactory2`则实现了这些接口,分别创建了`ProductA1`、`ProductB1`和`ProductA2`、`ProductB2`。
抽象工厂模式的应用场景主要包括:
1. 当需要创建的产品是一组有相互关系或依赖的对象时。
2. 客户端需要使用一个产品族中的多个对象,而不想知道它们的具体实现。
3. 当产品的具体类可能随着版本或配置的变化而变化时,可以使用抽象工厂模式来隔离这些变化。
通过使用抽象工厂模式,可以降低系统各部分之间的耦合性,增加系统的可扩展性。在C++中,这可以通过模板方法、多态和接口等特性来实现。抽象工厂模式是一种重要的设计模式,它在复杂系统的设计中起到了关键作用,帮助开发者更好地组织代码,提高代码的可读性和可维护性。