工厂模式 是 为了 解决对象的创建问题,封装实例化 的逻辑。 关注点是 如何创建对象。
一.工厂模式简介
工厂模式(Factory Pattern)是一种创建型设计模式,它提供一个创建对象的接口,但由子类决定要实例化的类是哪一个。换句话说,工厂模式把对象的创建过程封装起来,使客户端代码与具体实现解耦。
优点:
-
解耦客户端与具体类:客户端不需要知道具体类名,只需通过工厂获取对象。
-
提高扩展性:增加新产品类时,只需增加对应工厂即可,客户端代码无需修改。
-
集中管理对象创建:便于维护和修改对象创建逻辑。
缺点:
-
增加类的数量:每增加一个产品就可能需要增加一个工厂类。
-
工厂模式对系统增加新产品的灵活性较高,但增加新产品会增加工厂类的复杂度。
适用场景:
-
当创建对象的逻辑复杂,需要封装起来时。
-
当客户端只需要通过接口或抽象类使用对象,而不关心具体实现时。
-
当系统需要将对象的创建与使用分离时。
二.工厂模式实现
假设我们有不同形状的类(Circle、Rectangle),希望通过工厂统一创建对象。
#include <iostream>
#include <memory>
// 1. 抽象产品类
class Shape {
public:
virtual void draw() = 0;
virtual ~Shape() {}
};
// 2. 具体产品类
class Circle : public Shape {
public:
void draw() override {
std::cout << "Draw Circle" << std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() override {
std::cout << "Draw Rectangle" << std::endl;
}
};
// 3. 工厂类
class ShapeFactory {
public:
enum ShapeType { CIRCLE, RECTANGLE };
static std::unique_ptr<Shape> createShape(ShapeType type) {
switch (type) {
case CIRCLE:
return std::make_unique<Circle>();
case RECTANGLE:
return std::make_unique<Rectangle>();
default:
return nullptr;
}
}
};
// 4. 客户端代码
int main() {
auto circle = ShapeFactory::createShape(ShapeFactory::CIRCLE);
circle->draw();
auto rectangle = ShapeFactory::createShape(ShapeFactory::RECTANGLE);
rectangle->draw();
return 0;
}
说明:
-
Shape是抽象产品类。 -
Circle和Rectangle是具体产品类。 -
ShapeFactory提供一个静态方法createShape来创建不同类型的对象。 -
客户端只需要知道工厂和抽象产品类即可,不需要关心具体实现。
三.总结:
-
工厂类 就是一个 “统一的入口”,负责创建对象,不让客户端直接去
new具体类。 -
具体类型的选择 通常是根据客户端提供的信息(比如枚举、字符串、参数等)来决定创建哪种具体对象。
-
客户端只依赖抽象类或接口,不知道也不需要知道具体实现类,从而实现解耦。
所以工厂模式的核心就是:封装对象创建逻辑 + 根据输入动态选择具体类型。
1432

被折叠的 条评论
为什么被折叠?



