C++ 设计模式之简单工厂模式
简介
1、简单工厂模式是设计模式中的一种创建型模式,它提供了一种将实例化对象的责任交给一个专门的工厂类来创建的方法,使得客户端无需关心具体对象如何被创建,只需通过工厂类来获取所需的对象。
2、简单工厂模式 (Simple Factory)应用场景包括但不限于:
2.1、当创建对象的逻辑比较简单时可以采用简单工厂模式。
2.2、当一个类需要创建很多小对象中的某一个时,可以使用这种模式来封装创建细节。
2.3、当系统需要对创建过程进行封装,但创建的对象较少,不足以形成一个具有多样产品的完整工厂时。
3、简单工厂模式的构成
简单工厂模式的核心思想是将实例化对象的代码与使用对象的代码分离,降低系统的耦合度,使得系统更加灵活和可扩展。
3.1、产品接口
class Product
{
public:
virtual void Operation() = 0;
virtual ~Product() = default;
};
3.2、定义具体产品A
class ConcreteProductA : public Product
{
public:
void Operation();
};
3.3、定义具体产品B
class ConcreteProductB : public Product
{
public:
void Operation();
};
3.4、定义简单工厂类
class SimpleFactory
{
public:
// 根据传入的类型参数来创建相应的产品对象
static Product* CreateProduct(const std::string& strType);
};
4、简单工厂模式的优点:
4.1、客户端只需要知道所需产品的类型或名称,无需知道具体创建细节,降低了系统的耦合度。
4.2、工厂类集中了所有产品对象的创建逻辑,有利于系统的管理和维护。
5、简单工厂模式的缺点:
5.1、工厂类负责所有对象的创建,违背了单一职责原则,当产品类型较多时,工厂类的代码会变得复杂。
5.2、工厂类的创建逻辑是硬编码的,新增或修改产品类型时需要修改工厂类的代码,违反了开放封闭原则。
6、示例
定义
// 产品接口
class Product
{
public:
virtual void Operation() = 0;
virtual ~Product() = default;
};
// 具体产品A
class ConcreteProductA : public Product
{
public:
void Operation();
};
// 具体产品B
class ConcreteProductB : public Product
{
public:
void Operation();
};
// 简单工厂类
class SimpleFactory
{
public:
// 根据传入的类型参数来创建相应的产品对象
static Product* CreateProduct(const std::string& strType);
};
实现
void ConcreteProductA::Operation()
{
std::cout << "操作产品A" << std::endl;
}
void ConcreteProductB::Operation()
{
std::cout << "操作产品B" << std::endl;
}
Product* SimpleFactory::CreateProduct(const std::string& strType)
{
if (strType == "A")
{
return new ConcreteProductA();
}
else if (strType == "B")
{
return new ConcreteProductB();
}
return nullptr;
}
调用
auto factoryA = SimpleFactory::CreateProduct("A");
factoryA->Operation();
delete factoryA;
auto factoryB = SimpleFactory::CreateProduct("B");
factoryB->Operation();
delete factoryB;