1 简单工厂模式的概念
简单工厂模式(Simple Factory Pattern)是设计模式中的一种创建型模式。它的主要目的是将对象的实例化与使用解耦,使得客户端无需关心对象的创建细节,只需通过工厂类来获取所需的对象。
在简单工厂模式中,通常会有一个工厂类,它负责根据客户端的请求创建并返回相应的对象。客户端只需调用工厂类的方法并传入相应的参数,即可获取所需的对象,而无需关心对象的创建过程。
在简单工厂模式中,通常包括以下几个角色:
(1)工厂(Creator)角色: 工厂角色是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。
(2)抽象产品(Product)角色: 抽象产品角色是简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
(3)具体产品(Concrete Product)角色: 具体产品角色是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
简单工厂模式允许客户端只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其创建的细节。这有利于明确各个类的职责,并优化整个软件体系结构。
2 简单工厂模式的实现步骤
在 C++ 实现简单工厂模式的实现步骤如下:
(1)定义产品接口: 首先,你需要定义一个抽象的产品接口,这个接口将声明所有产品对象都需要实现的方法。这确保了工厂方法能够返回统一类型的产品对象,而客户端则可以通过这个接口来操作这些对象。
(2)实现具体产品类: 接下来,创建实现了产品接口的具体产品类。这些类将实现接口中定义的方法,并且提供具体的功能。
(3)创建工厂类: 然后,你需要创建一个工厂类,这个类将负责根据客户端的请求创建并返回相应的产品对象。工厂类通常包含一个静态方法,这个方法接收一个参数(如产品类型或标识符),然后基于这个参数来实例化并返回相应的产品对象。
(4)客户端调用工厂方法: 客户端代码不需要直接实例化产品对象,而是调用工厂类的静态方法,并传入所需的参数。工厂方法根据这些参数创建并返回相应的产品对象。
(5)客户端使用产品对象: 客户端现在可以通过产品接口来使用返回的产品对象,而无需关心对象是如何创建的。
(6)处理资源释放: 由于工厂模式通常涉及到动态内存分配(例如使用 new 关键字创建对象),因此客户端在使用完产品对象后需要负责释放这些对象所占用的资源(如使用 delete 关键字)。这通常是客户端调用工厂方法后需要注意的一个方面。
如下为样例代码:
#include <iostream>
#include <memory>
#include <string>
// 产品抽象接口
class Product {
public:
virtual void use() = 0;
virtual ~Product() {
} // 虚析构函数确保正确释放派生类对象
};
// 具体产品类A
class ProductA : public Product {
public:
void use() override {
std::cout << "Using ProductA" << std::endl;
}
};
// 具体产品类B
class ProductB : public Product {
public:
void use() override {
std::cout << "Using ProductB" << std::endl;
}
};
// 工厂类
class SimpleFactory {
public:
// 使用智能指针返回产品对象
static std::unique_ptr<Product> createProduct(const std::string& type) {
if (type == "A") {
return std::