工厂模式是一种创建型设计模式,它提供了一种封装对象创建过程的方式。在工厂模式中,我们将对象的实例化过程移到一个独立的工厂类中,客户端通过调用工厂类的方法来创建对象,而不是直接使用 new 关键字实例化对象。
工厂模式有多种变体,其中最常见的是简单工厂模式、工厂方法模式和抽象工厂模式。
假设我们有一个图形类 Shape
,它有两个派生类 Circle
和 Rectangle
。我们使用工厂模式来创建这些图形对象。首先,我们定义一个抽象的基类 Shape
,它声明了一个纯虚函数 draw()
:
class Shape {
public:
virtual void draw() = 0;
};
然后,我们创建两个派生类 Circle
和 Rectangle
,它们实现了 draw()
函数:
class Circle : public Shape {
public:
void draw() {
cout << "Drawing a circle." << endl;
}
};
class Rectangle : public Shape {
public:
void draw() {
cout << "Drawing a rectangle." << endl;
}
};
接下来,我们定义一个工厂类 ShapeFactory
,它根据客户端传入的参数创建相应的图形对象:
class ShapeFactory {
public:
Shape* createShape(string type) {
if (type == "circle") {
return new Circle();
} else if (type == "rectangle") {
return new Rectangle();
} else {
return nullptr;
}
}
};
最后,我们可以在客户端代码中使用工厂类来创建图形对象:
int main() {
ShapeFactory factory;
Shape* shape1 = factory.createShape("circle");
shape1->draw(); // 输出:Drawing a circle.
Shape* shape2 = factory.createShape("rectangle");
shape2->draw(); // 输出:Drawing a rectangle.
delete shape1;
delete shape2;
return 0;
}
在上面的示例中,客户端通过调用 ShapeFactory
的 createShape()
方法来创建图形对象,而不需要直接使用 new
关键字。这样,客户端与具体的图形类解耦,可以通过工厂类来创建不同的图形对象,而无需关心对象创建的具体细节。
工厂模式的优点在于它可以提供一种灵活的对象创建方式,可以根据需求动态地创建不同类型的对象。此外,工厂模式也符合单一职责原则,将对象创建的逻辑封装在工厂类中,使得代码更加可维护和可扩展。
工厂模式的引入主要是为了解决以下设计问题:
同样也带来了一些弊端:
------本页内容已结束,喜欢请分享------