简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。
简单工厂模式包括三个主要部分:
UML关系图如下:
上图Factory的CreateProduct方法是需要参数的,它根据参数创建不同类的实例,例如可能是产品类名。
简单工厂模式隐藏了对象创建逻辑,用户只需传入工厂方法所需参数即可得到对象。
#include <iostream>
#include <string>
using namespace std;
// 抽象产品类
class Product {
public:
virtual void Operation() = 0;
};
// 具体产品类 A
class ConcreteProductA : public Product {
public:
virtual void Operation() {
cout << "Operation from Product A" << endl;
}
};
// 具体产品类 B
class ConcreteProductB : public Product {
public:
virtual void Operation() {
cout << "Operation from Product B" << endl;
}
};
// 工厂类,负责创建产品对象
class SimpleFactory {
public:
Product* CreateProduct(const std::string& product_name) {
if (product_name == "A") {
return new ConcreteProductA();
} else if(product_name == "B") {
return new ConcreteProductB();
} else {
return nullptr;
}
}
};
// 客户端代码
int main() {
SimpleFactory factory;
Product* A = factory.CreateProduct("A");
if(A) {
A->Operation();
delete A;
}
Product* B = factory.CreateProduct("B");
if(B) {
B->Operation();
delete A;
}
return 0;
}
它具有以下几个优点:
隐藏对象的创建逻辑:简单工厂模式将对象的创建过程封装在一个工厂类中,客户端只需要通过工厂类来获取所需的产品对象,而无需关心具体的创建细节。这样可以降低客户端与具体产品类之间的耦合度。
集中管理对象的创建:通过使用简单工厂模式,可以集中管理对象的创建过程,避免了对象的创建分散在多处的情况。这样可以使得代码更加清晰、易于维护和扩展。
可扩展:如果需要新增一种产品类型,只需要在工厂类中添加相应的创建逻辑即可,而无需修改客户端的代码。站在客户端的角度看,这符合开闭原则,对扩展开放、对修改关闭。
提高代码的可测试性:由于简单工厂模式将对象的创建过程与具体产品类解耦,可以方便地对工厂类进行单元测试,验证其创建的产品对象是否符合预期。
尽管简单工厂模式具有上述优点,但也存在一些潜在的缺点:
在具体应用中,需要根据实际情况选择合适的设计模式。
适用场景:
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心