工厂模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方法。它提供了一种创建对象的最佳方式。这样可以解耦客户端代码与具体的产品类,使得系统更易于维护和扩展。
工厂模式的核心思想是将对象的创建与使用分离,客户端不再直接负责创建对象,而是通过工厂类来创建所需的对象。这样,客户端只需要知道所需对象的接口,而无需关心具体的实现细节。工厂模式可以隐藏对象的创建逻辑,使得系统更加易于维护和扩展。
以下例子中,假设有一个Shape接口,以及两个实现了这个接口的类Circle和Rectangle。将创建一个ShapeFactory类,它可以根据传入的参数来创建不同类型的Shape对象。
// Shape.h
#ifndef SHAPE_H
#define SHAPE_H
class Shape {
public:
virtual ~Shape() {}
virtual void draw() = 0;
};
#endif // SHAPE_H
// Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
#include "Shape.h"
class Circle : public Shape {
public:
void draw() override {
std::cout << "Inside Circle::draw()" << std::endl;
}
};
#endif // CIRCLE_H
// Rectangle.h
#ifndef RECTANGLE_H
#define RECTANGLE_H
#include "Shape.h"
class Rectangle : public Shape {
public:
void draw() override {
std::cout << "Inside Rectangle::draw()" << std::endl;
}
};
#endif // RECTANGLE_H
// ShapeFactory.h
#ifndef SHAPEFACTORY_H
#define SHAPEFACTORY_H
#include <string>
#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;
}
};
#endif // SHAPEFACTORY_H
现在,可以在客户端代码中使用ShapeFactory来创建Shape对象,而无需直接引用具体的Shape子类。
#include <iostream>
#include "ShapeFactory.h"
int main() {
Shape* shape1 = ShapeFactory::createShape("CIRCLE");
shape1->draw();
delete shape1;
Shape* shape2 = ShapeFactory::createShape("RECTANGLE");
shape2->draw();
delete shape2;
return 0;
}
在这个例子中,ShapeFactory的createShape方法根据传入的字符串参数来决定创建哪种类型的Shape对象。
这样,客户端代码与具体的Shape子类解耦了,使得系统更加灵活和易于维护。
如果需要添加新的Shape子类,只需在ShapeFactory中添加相应的创建逻辑即可,而无需修改客户端代码。