在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
方法。這樣,我們就可以在運行時動態地改變要創建的對象的類型,而不需要修改客戶端代碼。