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