一、UML图
二、代码
#include <iostream>
using namespace std;
class HotDrinkClass {
public:
virtual void prepare() = 0;
};
class Tea :public HotDrinkClass
{
public :
void prepare() override {
cout << "HotDrink Tea OK" << endl;
}
};
class Coffee :public HotDrinkClass
{
public:
void prepare() override {
cout << "HotDrink Coffee OK" << endl;
}
};
class SnackClass {
public:
virtual void prepare() = 0;
};
class bread :public SnackClass
{
public:
void prepare() override {
cout << "snack bread OK" << endl;
}
};
class bun :public SnackClass
{
public:
void prepare() override {
cout << "snack bun OK" << endl;
}
};
class EatFactory
{
public:
virtual HotDrinkClass* make_drink() = 0;
virtual SnackClass* make_snack() = 0;
};
class EastEatFactory:public EatFactory
{
public:
HotDrinkClass* make_drink() override
{
return new Coffee();
}
SnackClass* make_snack() override
{
return new bread();
}
};
class WestEatFactory:public EatFactory
{
public:
HotDrinkClass* make_drink() override
{
return new Tea();
}
SnackClass* make_snack() override
{
return new bun();
}
};
class WaiterClass
{
EatFactory* m_a;
public:
void get_order(EatFactory* a)
{
m_a = a;
}
HotDrinkClass* make_drink()
{
return m_a->make_drink();
}
SnackClass* make_snack()
{
return m_a->make_snack();
}
};
void main() {
string infor;
EastEatFactory* east = new EastEatFactory;
WestEatFactory* west = new WestEatFactory;
WaiterClass Waiter;
cout << "-------------need east food or west food?-------------" << endl;
while (cin >> infor)
{
if (infor == "east")
{
Waiter.get_order(east);
HotDrinkClass* hotdrink = Waiter.make_drink();
SnackClass* snack = Waiter.make_snack();
hotdrink->prepare();
snack->prepare();
}
else if (infor == "west")
{
Waiter.get_order(west);
HotDrinkClass* hotdrink = Waiter.make_drink();
SnackClass* snack = Waiter.make_snack();
hotdrink->prepare();
snack->prepare();
}
else
{
cout << "-------------wrong information,try again-------------" << endl;
continue;
}
cout << "-------------need anything else?-------------" << endl;
}
}
三、解析
Waiter是client,当有新的EatFactory派生类出现时,只需要将此派生类传入Waiter即可,Waiter根据EatFactory根据相应的接口,直接可以做出指定的食物,无需改变其内部代码,做到了解耦。