设计模式之简单工厂模式

思路

工厂模式是一种创建型设计模式,它提供了一种将对象的创建逻辑封装在一个单独的类中的方式。工厂模式通过定义一个公共的接口来创建对象,而不是直接在客户端代码中使用new关键字来实例化对象。这样做的好处是,客户端代码与具体的产品类解耦,使得代码更加灵活、可扩展和可维护。

工厂模式通常包含以下几个角色:

  1. 抽象产品(Abstract Product):定义了产品的接口,所有具体产品类都必须实现这个接口。
  2. 具体产品(Concrete Product):实现了抽象产品接口的具体产品类。
  3. 工厂(Factory):负责创建产品对象的类,它包含一个创建产品的方法,根据传入的参数或条件来决定创建哪种具体产品。

客户端代码通过调用工厂类的方法来创建产品对象,而不需要直接实例化具体产品类。这样,当需要创建不同类型的产品时,只需要修改工厂类的创建方法,而不需要修改客户端代码。

优点

  • 将产品的创建和使用解耦,客户端代码只需要关心产品的接口,而不需要关心具体的产品类。
  • 可以通过工厂类的创建方法来集中管理产品的创建逻辑,使得代码更加灵活和可维护。
  • 可以通过工厂类来隐藏具体产品的实现细节,提高代码的安全性。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <string>

// 抽象产品类
class Product {
public:
virtual void use() = 0;
};

// 具体产品类A
class ConcreteProductA : public Product {
public:
void use() override {
std::cout << "Using ConcreteProductA" << std::endl;
}
};

// 具体产品类B
class ConcreteProductB : public Product {
public:
void use() override {
std::cout << "Using ConcreteProductB" << std::endl;
}
};

// 工厂类
class Factory {
public:
// 创建产品的方法
static Product* createProduct(const std::string& type) {
if (type == "A") {
return new ConcreteProductA();
} else if (type == "B") {
return new ConcreteProductB();
}
return nullptr;
}
};

int main() {
// 使用工厂创建产品
Product* productA = Factory::createProduct("A");
if (productA) {
productA->use();
delete productA;
}

Product* productB = Factory::createProduct("B");
if (productB) {
productB->use();
delete productB;
}

return 0;
}

值得注意的是,工厂类的创建产品的方法一般使用静态函数实现,原因是不需要实例化对象,可以直接通过类名调用,简化代码避免额外开销。