目录
工厂模式
工厂模式(Factory Pattern)是一种创建型设计模式,旨在提供一种统一的方式来创建对象,而无需指定其具体类。它通过提供一个共同的接口来创建对象,这个接口的具体实现可以根据不同的需求返回不同类的对象实例。
工厂模式的主要优势
-
封装对象创建逻辑:工厂模式将对象的实例化过程集中在一个位置,客户端代码不需要直接实例化对象,从而降低了耦合度。
-
简化对象替换:由于客户端代码仅依赖于工厂接口,如果需要更改创建的具体类,只需调整工厂的实现,而不需要修改客户端代码。
-
支持多态性:工厂方法通常会定义为虚函数,这样在子类中可以根据需要重写工厂方法,返回不同的对象实例,从而实现多态。
工厂模式的几种常见变体
-
简单工厂模式(Simple Factory Pattern):
- 定义一个工厂类,通过静态方法根据传入的参数创建不同的产品实例。这种模式不属于23种经典设计模式,但常被用来学习工厂模式的基本概念。
-
工厂方法模式(Factory Method Pattern):
- 将工厂抽象成一个接口或抽象类,由子类决定实例化哪个具体产品类。每个具体工厂类对应创建一个具体产品类的实例,从而支持更灵活的对象创建过程。
-
抽象工厂模式(Abstract Factory Pattern):
- 提供一个接口用于创建相关或依赖对象的家族,而不需要明确指定具体类。它利用工厂方法来创建不同但相关的产品,使得易于交换产品系列。
#include <iostream>
#include <memory>
// 抽象产品类
class Product {
public:
virtual void operation() = 0;
virtual ~Product() {}
};
// 具体产品A
class ConcreteProductA : public Product {
public:
void operation() override {
std::cout << "ConcreteProductA" << std::endl;
}
};
// 具体产品B
class ConcreteProductB : public Product {
void operation() override {
std::cout << "ConcreteProductB" << std::endl;
}
};
// 工厂类
class Factory {
public:
virtual std::unique_ptr<Product> createProduct() = 0;
virtual ~Factory() {}
};
// 具体工厂类A
class ConcreteFactoryA : public Factory {
public:
std::unique_ptr<Product> createProduct() override {
return std::make_unique<ConcreteProductA>();
}
};
// 具体工厂类B
class ConcreteFactoryB : public Factory {
public:
std::unique_ptr<Product> createProduct() override {
return std::make_unique<ConcreteProductB>();
}
};
int main()
{
// 使用具体工厂类A创建具体产品类A的实例
std::unique_ptr<Factory> factoryA = std::make_unique<ConcreteFactoryA>();
std::unique_ptr<Product> productA = factoryA->createProduct();
productA->operation();
// 使用具体工厂类B创建具体产品类B的实例
std::unique_ptr<Factory> factoryB = std::make_unique<ConcreteFactoryB>();
std::unique_ptr<Product> productB = factoryB->createProduct();
productB->operation();
return 0;
}
解析示例代码
-
产品类和具体产品类:
Product
是一个抽象基类,定义了产品对象的接口。ConcreteProductA
和ConcreteProductB
是具体产品类,实现了Product
的接口,提供了具体的操作实现。
-
工厂类和具体工厂类:
Factory
是一个抽象基类,声明了工厂方法createProduct()
,返回Product
类型的指针。ConcreteFactoryA
和ConcreteFactoryB
是具体工厂类,分别实现了工厂方法createProduct()
,返回ConcreteProductA
和ConcreteProductB
的实例。
-
客户端代码:
- 在
main()
函数中,首先使用具体工厂类 A 创建ConcreteProductA
的实例,然后调用operation()
方法执行操作。 - 使用具体工厂类 B 创建
ConcreteProductB
的实例,同样调用operation()
方法执行操作。
- 在