C++二十三种设计模式之抽象工厂模式
- 一、组成
- 二、特点
- 三、目的
- 四、缺点
- 五、示例代码
一、组成
抽象产品类:声明产品功能公共接口。
具体产品类:实现产品功能接口。
抽象工厂类:声明创建一组具体产品公共接口。
具体工厂类:实现创建一组具体产品接口。
二、特点
1、抽象工厂创建具体产品接口返回抽象产品类型。
2、一个具体工厂创建一组特定风格产品。
三、目的
无需指定具体类的情况下,为一组相互依赖的对象提供创建接口。
四、缺点
1、违反开闭原则,新增产品类需要改动原有的工厂类。
2、场景限制问题,通常用于创建一组相互依赖的对象,意味着不适合于高度灵活的场景。
五、示例代码
#include<iostream>
#include <vector>
#include <string>
#include <mutex>
using namespace std;
class Shape;//抽象产品类
class Rectangle;//具体产品类
class Circle;//具体产品类
class Color;//抽象产品类
class Red;//具体产品类
class Blue;//具体产品类
class AbstractFactory;//抽象工厂类
class ConcreteFactory;//具体工厂类
class ConcreteFactory2;//具体工厂类
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 Color {
public:
virtual ~Color() {};
virtual void fill() = 0;
};
class Red : public Color{
public:
~Red() {}
void fill() {
cout << "Filling with Red Color" << endl;
}
};
class Blue : public Color {
public:
~Blue() {}
void fill() {
cout << "Filling with Blue Color" << endl;
}
};
class AbstractFactory {
public:
virtual ~AbstractFactory() {};
virtual unique_ptr<Shape> createShape() = 0;
virtual unique_ptr<Color> createColor() = 0;
};
class ConcreteFactory : public AbstractFactory {
public:
~ConcreteFactory() {};
unique_ptr<Shape> createShape() {
return make_unique<Rectangle>();
};
unique_ptr<Color> createColor() {
return make_unique<Red>();
};
};
class ConcreteFactory2 : public AbstractFactory {
public:
~ConcreteFactory2() {};
unique_ptr<Shape> createShape() {
return make_unique<Circle>();
};
unique_ptr<Color> createColor() {
return make_unique<Blue>();
};
};
int main() {
AbstractFactory* factory = new ConcreteFactory();
unique_ptr<Shape> shape = factory->createShape();
unique_ptr<Color> color = factory->createColor();
shape->draw();
color->fill();
AbstractFactory* factory2 = new ConcreteFactory();
unique_ptr<Shape> shape2 = factory->createShape();
unique_ptr<Color> color2 = factory->createColor();
shape2->draw();
color2->fill();
}