C++二十三种设计模式之工厂方法模式
- 一、组成
- 二、特点
- 三、目的
- 四、缺点
- 五、示例代码
一、组成
抽象产品类:声明产品功能公共接口。
具体产品类:实现产品功能接口。
抽象工厂类:声明创建具体产品公共接口。
具体工厂类:实现创建具体产品接口。
二、特点
1、抽象工厂创建具体产品接口返回抽象产品类型。
2、一个具体工厂创建一个特定风格产品。
三、目的
无需指定具体类的情况下,创建一个特定风格的产品。
四、缺点
1、类膨胀问题,每增加一个产品类,需要对应增加一个工厂类。
五、示例代码
#include<iostream>
#include <vector>
#include <string>
#include <mutex>
using namespace std;
class Shape;//抽象产品类
class Rectangle;//具体产品类
class Circle;//具体产品类
class AbstractFactory;//抽象工厂类
class RectangleFactory;//具体工厂类
class CircleFactory;//具体工厂类
class Shape {
public:
virtual ~Shape() {}
virtual void draw() = 0;
};
class Rectangle :public Shape {
public:
~Rectangle() {}
void draw() {
cout << "Drawing a Rectangle" << endl;
}
};
class Circle :public Shape {
public:
~Circle() {}
void draw() {
cout << "Drawing a Circle" << endl;
}
};
class AbstractFactory {
public:
virtual ~AbstractFactory() {};
virtual unique_ptr<Shape> createShape() = 0;
};
class RectangleFactory : public AbstractFactory {
public:
~RectangleFactory() {};
unique_ptr<Shape> createShape() {
return make_unique<Rectangle>();
};
};
class CircleFactory : public AbstractFactory {
public:
~CircleFactory() {};
unique_ptr<Shape> createShape() {
return make_unique<Circle>();
};
};
int main() {
AbstractFactory* factoryRectangle = new RectangleFactory();
unique_ptr<Shape> rectangle = factoryRectangle->createShape();
rectangle->draw();
AbstractFactory* factoryCircle = new CircleFactory();
unique_ptr<Shape> circle = factoryCircle->createShape();
circle->draw();
}