工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,创建对象的任务被委托给专门的工厂类,而不是在客户端代码中直接通过 new
操作符创建。这样,客户端代码就可以从具体的产品类中解耦,提高代码的灵活性和可维护性。
工厂模式的主要类型包括:
-
简单工厂模式:一个具体的工厂类负责创建一个或多个产品类的实例。简单工厂模式通常不包含在设计模式的讨论中,因为它是基于工厂方法模式思想的简化版本。
-
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
-
抽象工厂模式:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。
实现工厂模式的好处包括:
-
解耦:客户端代码不需要知道具体产品的类,只需要知道工厂接口,这降低了系统各部分之间的依赖性。
-
扩展性:当需要增加新产品时,只需要添加新的具体产品类和对应的工厂方法,无需修改现有代码。
-
集中管理对象创建:对象的创建逻辑集中在工厂类中,便于管理和维护。
-
代码重用:相同的创建逻辑可以在不同地方重用,避免重复代码。
-
灵活性:可以很容易地切换具体产品的实现,只需改变工厂方法的实现。
示例代码:
假设有一个 Shape
接口和几个实现 Shape
的类(如 Circle
, Rectangle
),我们可以使用工厂方法模式来创建这些形状对象。
// Shape.h
class Shape {
public:
virtual void draw() = 0;
virtual ~Shape() {}
};
// Circle.h
#include "Shape.h"
class Circle : public Shape {
public:
void draw() override {
std::cout << "Drawing a Circle" << std::endl;
}
};
// Rectangle.h
#include "Shape.h"
class Rectangle : public Shape {
public:
void draw() override {
std::cout << "Drawing a Rectangle" << std::endl;
}
};
// ShapeFactory.h
#include "Shape.h"
class ShapeFactory {
public:
static Shape* createShape(const std::string& shapeType) {
if (shapeType == "circle") {
return new Circle();
} else if (shapeType == "rectangle") {
return new Rectangle();
}
return nullptr;
}
};
// Client code
int main() {
Shape* shape = ShapeFactory::createShape("circle");
shape->draw();
delete shape;
return 0;
}
在这个例子中,ShapeFactory
类负责创建 Shape
对象。客户端代码只需要知道 ShapeFactory
,而不需要知道具体的 Circle
或 Rectangle
类。这使得添加新的形状类型或修改现有形状的创建逻辑变得更加容易。