概述
抽象工厂模式与工厂模式基本类似,只是新创建了一个抽象工厂类和生成工厂类,可以理解为将工厂也作为一种产品生成,就如同形状工厂生成不同形状一样,生成工厂类生成不同的工厂:
代码实例
//各种形状
class Shape {
public:
virtual void draw() = 0;
};
class Circle :public Shape{
public:
void draw() override {
cout << "this is a Circle" << endl;
}
};
class Rectangle1 :public Shape {
public:
void draw() override {
cout << "this is a Rectangle" << endl;
}
};
class Square :public Shape {
public:
void draw() override {
cout << "this is a Square" << endl;
}
};
//各种颜色
class Color {
//public:
virtual void print() = 0;
};
class Red :public Color {
public:
void print() override {
cout << "I am Red" << endl;
}
};
class Green :public Color {
public:
void print() override {
cout << "I am Green" << endl;
}
};
class Blue :public Color {
public:
void print() override {
cout << "I am Blue" << endl;
}
};
//抽象工厂衍生出两种工厂
class AbstractFactory {
public:
virtual Shape* getShape(const string &pattern) const = 0;
virtual Color* getColor(const string &pattern) const = 0;
};
class ColorFactory :public AbstractFactory {
public:
Color *getColor(const string &pattern) const override {
if (pattern.empty())
return nullptr;
if (pattern == "Red")
return new Red;
else if (pattern == "Green")
return new Green;
else if (pattern == "Blue")
return new Blue;
return nullptr;
}
Shape* getShape(const string &pattern) const override {
return nullptr;
}
};
class ShapeFactory :public AbstractFactory{
public:
Shape* getShape(const string &pattern) const override {
if (pattern.empty())
return nullptr;
if (pattern == "Circle")
return new Circle;
else if (pattern == "Rectangle")
return new Rectangle1;
else if (pattern == "Square")
return new Square;
return nullptr;
}
Color *getColor(const string &pattern) const override {
return nullptr;
}
};
//工厂生成类生成不同的工厂
class FactoryProducer {
public:
AbstractFactory* getShapeFactory() const {
return new ShapeFactory;
}
AbstractFactory* getColorFactory()const {
return new ColorFactory;
}
};
int main() {
FactoryProducer a;
AbstractFactory *SF = a.getShapeFactory();
Shape* shape = SF->getShape("Circle");
shape->draw();
system("pause");
}
输出:
this is a Circle
请按任意键继续. . .