抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
案例:在上一章节工厂方法模式的基础上,将披萨的各种原料生产抽象成一个AbstractProduct类(这个抽象的产品类可以有多个)。
抽象工厂模式的一个优点是把一群相关的产品(披萨的各种原料的不同配方)集合起来。
抽象工厂模式就是把工厂方法模式中各个披萨具体原料实现类集合起来,统一了各种原材料。
抽象工厂:使用对象组合,对象的创建被实现中工厂接口所暴露出来的方法中。
工厂方法:使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象。
抽象工厂模式:提供接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
对于披萨原料生产产品家族(crust工厂、sugar工厂、milk工厂等),每个工厂都有不同的实现。
缺点
难以支持新种类的产品。因为抽象工厂接口确定了可以被创建的产品集合,所以难以扩展抽象工厂以生产新种类的产品。
类图:
实现如下:
pizzaStore.h:
#ifndef PIZZASTORE_H
#define PIZZASTORE_H
#include "pizza.h"
class PizzaStore {
public:
virtual Pizza* orderPizza(string type) = 0;
private:
virtual Pizza* createPizza(string type) = 0;
};
#endif // PIZZASTORE_H
chinaPizzaStore.h:
#ifndef CHINAPIZZASTORE_H
#define CHINAPIZZASTORE_H
#include "pizzaStore.h"
class ChinaPizzaStore : public PizzaStore {
public:
virtual Pizza* orderPizza(string type) override;
private:
virtual Pizza* createPizza(string type) override;
};
Pizza* ChinaPizzaStore::createPizza(string type)
{
Pizza* pizza;
if(type == "halfSugarAndThickCrust")
{
pizza->prepareSugar("halfSugar");
pizza->prepareCrust("thickCrust");
}
//else if
return pizza;
}
Pizza* ChinaPizzaStore::orderPizza(string type)
{
return createPizza(type);
}
#endif // CHINAPIZZASTORE_H
pizza.h:
#ifndef PIZZA_H
#define PIZZA_H
#include "halfSugar.h"
#include "thickCrust.h"
class Pizza {
public:
void prepareSugar(string type);
void prepareCrust(string type);
void display();
private:
Sugar* m_sugar;
Crust* m_crust;
};
void Pizza::prepareCrust(string type)
{
if(type == "thickCrust")
{
m_crust = new ThickCrust();
m_crust->display();
}
}
void Pizza::prepareSugar(string type)
{
if(type == "halfSugar")
{
m_sugar = new HalfSugar();
m_sugar->display();
}
}
void Pizza::display()
{
cout << " 披萨制作好了!\n";
}
#endif // PIZZA_H
sugar.h:
#ifndef SUGAR_H
#define SUGAR_H
#include <iostream>
#include <string>
using namespace std;
class Sugar {
public:
virtual void display() = 0;
};
#endif // SUGAR_H
halfSugar.h:
#ifndef HALFSUGAR_H
#define HALFSUGAR_H
#include "sugar.h"
class HalfSugar : public Sugar {
public:
virtual void display() override;
};
void HalfSugar::display()
{
cout << "半糖 ";
}
#endif // HALFSUGAR_H
crust.h:
#ifndef CRUST_H
#define CRUST_H
#include <iostream>
#include <string>
using namespace std;
class Crust {
public:
virtual void display() = 0;
};
#endif // CRUST_H
thickCrust.h:
#ifndef THICKCRUST_H
#define THICKCRUST_H
#include "crust.h"
class ThickCrust : public Crust {
public:
virtual void display() override;
};
void ThickCrust::display()
{
cout <<"硬面包片";
}
#endif // THICKCRUST_H
main.cpp:
/*
* 抽象工厂模式
*
* date:2023-9-10
*/
#include "chinaPizzaStore.h"
int main()
{
cout << "要一份半糖,硬面包片的中式披萨\n" << endl;
PizzaStore *pizzaStore = new ChinaPizzaStore();
Pizza* pizza = pizzaStore->orderPizza("halfSugarAndThickCrust");
pizza->display();
}
运行截图: