😉一、基础概念
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
在抽象工厂模式中,客户端通过调用抽象工厂接口中的方法来创建一系列相关的产品对象。这些产品对象都是由具体的工厂类来创建的,每个具体工厂类都负责创建一组特定的产品。
抽象工厂模式的优点是可以保证客户端始终只使用同一组产品,而不会出现不兼容的情况。此外,通过使用抽象工厂模式,可以使客户端与具体产品的实现相分离,从而使系统更加灵活,易于扩展和维护。
在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。
🐱🐉二、抽象工厂模式实现
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
首先,定义抽象产品类 AbstractProduct
,它包含了产品的公共方法:
class AbstractProduct { public: virtual void operation() = 0; virtual ~AbstractProduct() {} };
然后,定义具体产品类 ConcreteProductA
和 ConcreteProductB
,它们实现了抽象产品接口,具体实现了产品的方法:
class ConcreteProductA : public AbstractProduct { public: void operation() override { std::cout << "ConcreteProductA operation" << std::endl; } }; class ConcreteProductB : public AbstractProduct { public: void operation() override { std::cout << "ConcreteProductB operation" << std::endl; } };
接下来,定义抽象工厂接口 AbstractFactory
,它包含了创建一系列产品的方法:
class AbstractFactory { public: virtual AbstractProduct* createProductA() = 0; virtual AbstractProduct* createProductB() = 0; virtual ~AbstractFactory() {} };
然后,定义具体工厂类 ConcreteFactory
,它实现了抽象工厂接口,负责创建一组特定的产品:
class ConcreteFactory : public AbstractFactory { public: AbstractProduct* createProductA() override { return new ConcreteProductA(); } AbstractProduct* createProductB() override { return new ConcreteProductB(); } };
最后,客户端使用抽象工厂来创建一组产品:
int main() { AbstractFactory* factory = new ConcreteFactory(); AbstractProduct* productA = factory->createProductA(); AbstractProduct* productB = factory->createProductB(); productA->operation(); productB->operation(); delete productA; delete productB; delete factory; return 0; }
输出结果为:
ConcreteProductA operation ConcreteProductB operation
🎉三、注意事项
使用抽象工厂模式需要注意以下几点:
- 接口设计要合理:抽象工厂模式依赖接口而不是实现,因此在设计时需要考虑到具体产品的可能性和变化,保证接口足够灵活。
- 工厂类实现适度复杂:抽象工厂模式需要一个或多个工厂类来生产不同类型的产品,这些工厂类的实现会比较复杂且耦合度较高,需要根据具体情况进行权衡,尽量避免过于复杂的实现。
- 产品族扩展困难:抽象工厂模式的主要目的是支持多种产品族的扩展,但如果需要增加新的产品族,则需要修改工厂接口和所有的工厂实现,这一过程比较麻烦。
- 客户端代码可读性较差:由于抽象工厂模式提供了多个接口和多个产品等级结构,因此客户端代码相对会比较复杂,可读性不如简单工厂模式和工厂方法模式那么好。
🐱🚀四、抽象工厂模式什么时候用
- 当需要创建一组相关或相互依赖的对象时,可以使用抽象工厂模式。例如,创建一个具有不同操作系统的应用程序,每个操作系统都有自己的一组 UI 控件,可以使用抽象工厂模式来创建这些控件。
- 当希望客户端与具体产品的实现相分离时,可以使用抽象工厂模式。客户端只需要知道抽象工厂接口和抽象产品接口,而不需要知道具体工厂类和具体产品类的实现细节。
- 当希望系统更加灵活、易于扩展和维护时,可以使用抽象工厂模式。通过使用抽象工厂模式,可以轻松添加新的产品系列,而不会影响现有的代码。
需要注意的是,抽象工厂模式适用于创建一系列相关或相互依赖的产品,如果只需要创建单个产品,或者产品之间没有关系,则不适合使用抽象工厂模式。
🍳参考文献
🧊文章总结
提示:这里对文章进行总结:
本文讲了关于抽象工厂模式的概念