在C++中实现工厂模式通常涉及到一个抽象产品类(Product),一个或多个具体产品类(Concrete Product),以及一个抽象工厂类(Factory)和/或一个或多个具体工厂类(Concrete Factory)。下面是一个简单的示例:
这是我们要创建的对象的接口。在这个例子中,我们将创建一个简单的形状接口。
class Shape {
public:
virtual ~Shape() = default;
virtual void draw() const = 0;
};
这些是实现了抽象产品类接口的具体类。在这个例子中,我们将创建两个具体的形状类:圆形和矩形。
#include<iostream>
class Circle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a circle"<< std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a rectangle"<< std::endl;
}
};
工厂类负责创建抽象产品的实例。在这个例子中,我们将创建一个形状工厂接口。
class ShapeFactory {
public:
virtual ~ShapeFactory() = default;
virtual std::unique_ptr<Shape> createShape() const = 0;
};
这些是实现了抽象工厂类接口的具体类。在这个例子中,我们将创建两个具体的形状工厂类:圆形工厂和矩形工厂。
class CircleFactory : public ShapeFactory {
public:
std::unique_ptr<Shape> createShape() const override {
return std::make_unique<Circle>();
}
};
class RectangleFactory : public ShapeFactory {
public:
std::unique_ptr<Shape> createShape() const override {
return std::make_unique<Rectangle>();
}
};
现在我们可以使用这些工厂来创建形状对象,而不需要直接实例化它们。
#include<memory>
int main() {
std::unique_ptr<ShapeFactory> factory = std::make_unique<CircleFactory>();
std::unique_ptr<Shape> shape = factory->createShape();
shape->draw();
factory = std::make_unique<RectangleFactory>();
shape = factory->createShape();
shape->draw();
return 0;
}
在这个例子中,我们首先创建了一个圆形工厂,然后使用它来创建一个圆形对象并调用其draw
方法。然后我们改变了工厂,创建了一个矩形工厂,并用它来创建一个矩形对象并调用其draw
方法。这样,我们就可以在运行时动态地改变要创建的对象的类型,而不需要修改客户端代码。