✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
📌文章专栏 | ||
「C/C++」C/C++程序设计 | ||
📚全部专栏 | ||
「VS」Visual Studio | 「C/C++」C/C++程序设计 | 「UG/NX」BlockUI集合 |
「Win」Windows程序设计 | 「DSA」数据结构与算法 | 「UG/NX」NX二次开发 |
「QT」QT5程序设计 | 「File」数据文件格式 | 「PK」Parasolid函数说明 |
C++中抽象工厂模式(Abstract Factory)详解
一、引言
在面向对象编程中,设计模式是解决问题的最佳实践。抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来封装一组具有共同主题的单个工厂,而不需要指定它们的具体类。该模式允许客户端使用抽象的接口来创建一系列相关或依赖的对象,而无需关心具体的实现细节。本文将详细介绍C++中的抽象工厂模式,包括其定义、结构、优点、缺点以及应用场景。
二、定义
抽象工厂模式定义了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。该模式主要由四个部分组成:抽象工厂、具体工厂、抽象产品和具体产品。
- 抽象工厂(Abstract Factory):声明一个用于创建对象的接口。
- 具体工厂(Concrete Factory):实现抽象工厂接口,创建具体产品的实例。
- 抽象产品(Abstract Product):声明产品的接口。
- 具体产品(Concrete Product):实现抽象产品接口,是具体工厂创建的对象。
三、结构
以下是抽象工厂模式的典型结构:
// 抽象产品:汽车
class Car {
public:
virtual void drive() = 0;
virtual ~Car() {}
};
// 具体产品:SUV
class SUV : public Car {
public:
void drive() override {
std::cout << "Driving SUV car." << std::endl;
}
};
// 具体产品:轿车
class Sedan : public Car {
public:
void drive() override {
std::cout << "Driving sedan car." << std::endl;
}
};
// 抽象产品:手机
class Phone {
public:
virtual void call() = 0;
virtual ~Phone() {}
};
// 具体产品:安卓手机
class AndroidPhone : public Phone {
public:
void call() override {
std::cout << "Making a call with Android phone." << std::endl;
}
};
// 具体产品:苹果手机
class IPhone : public Phone {
public:
void call() override {
std::cout << "Making a call with iPhone." << std::endl;
}
};
// 抽象工厂
class AbstractFactory {
public:
virtual Car* createCar() = 0;
virtual Phone* createPhone() = 0;
virtual ~AbstractFactory() {}
};
// 具体工厂1:生产SUV和安卓手机
class ConcreteFactory1 : public AbstractFactory {
public:
Car* createCar() override {
return new SUV();
}
Phone* createPhone() override {
return new AndroidPhone();
}
};
// 具体工厂2:生产轿车和苹果手机
class ConcreteFactory2 : public AbstractFactory {
public:
Car* createCar() override {
return new Sedan();
}
Phone* createPhone() override {
return new IPhone();
}
};
四、使用示例
以下是如何使用抽象工厂模式的示例代码:
int main() {
// 使用具体工厂1创建SUV和安卓手机
AbstractFactory* factory1 = new ConcreteFactory1();
Car* suv = factory1->createCar();
Phone* androidPhone = factory1->createPhone();
suv->drive();
androidPhone->call();
delete suv;
delete androidPhone;
delete factory1;
// 使用具体工厂2创建轿车和苹果手机
AbstractFactory* factory2 = new ConcreteFactory2();
Car* sedan = factory2->createCar();
Phone* iPhone = factory2->createPhone();
sedan->drive();
iPhone->call();
delete sedan;
delete iPhone;
delete factory2;
return 0;
}
五、优点
- 分离具体的实现:客户端代码通过接口操作实例,不依赖于具体的类实现。
- 易于交换产品系列:因为具体工厂类在一个应用中只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得十分容易。
- 增加新的产品系列容易:扩展新的产品族比较方便,符合开闭原则(对扩展开放,对修改关闭)。
六、缺点
- 难以支持新种类的产品:一旦工厂类中定义好了创建产品的方法后,如果需要添加新产品就不容易,因为抽象工厂接口确定后不容易修改。
- 复杂度增加:随着产品族的增加,相关的具体工厂和产品类的数量也会增加,这会使系统更加复杂。
七、应用场景
- 系统独立于如何创建、组成和表示它的产品:系统应该对产品类的实现细节和创建过程无需了解。
- 系统需要多个产品系列中的一个来配置:可以动态地更改产品系列。
- 系统需要提供产品库的类,且只想显示它们的接口而不是实现。
八、总结
抽象工厂模式是一种强大的设计模式,它允许我们在不修改客户端代码的情况下,通过更换具体工厂来改变系统的行为。然而,该模式也增加了系统的复杂度和代码量,因此在选择使用时应谨慎考虑。合理地使用抽象工厂模式,可以显著提高代码的可读性、可维护性和可扩展性。