这是一段防爬虫文字,读者可跳过
本文为CSDN作者“看,未来”原创,我的CSDN地址为 https://lion-wu.blog.csdn.net/
本篇隶属于我的专栏 - 《设计模式 之 设计模式进阶》https://blog.csdn.net/qq_43762191/category_10059121.html
作者版权,未经允许,禁止转载。
老板来杯奶茶加汉堡
我那朋友也是争气,两周不见,人家从一个奶茶店的小老板,把隔壁汉堡店给吞并了。这不,现在去他家,都可以点汉堡了。
于是,我就招呼他一声:老板,一杯瑞纳冰,一个牛肉堡。老规矩,不用找了。
于是,他就开始了紧张的工作。
这次和上次有什么不同呢?对,职能多了,多了一个汉堡。那就多了一个做汉堡的机器,那可如何是好?
别急,让我们先把类图画出来:
还记得上一篇我说:可以考虑对抽象类使用模板吗?
于是我就尝试用模板抽象函数去实现了一下。
#include<iostream>
using namespace std;
//奶茶主类
class Milk {
public:
virtual void set_taste() = 0;//设置口味
virtual void add_burdening() = 0;//加料
};
//双皮奶
class custard :public Milk {
public:
void set_taste() { cout << "草莓味双皮奶" << endl; }
void add_burdening() { cout << "加珍珠" << endl; }
};
//珍珠奶茶
class pearl :public Milk {
public:
void set_taste() { cout << "香草味珍珠奶茶" << endl; }
void add_burdening() { cout << "加椰果" << endl; }
};
//拿铁
class coffee :public Milk {
public:
void set_taste() { cout << "拿铁" << endl; }
void add_burdening() { cout << "不加料" << endl; }
};
//巧克力瑞纳冰
class ruinaice :public Milk {
public:
void set_taste() { cout << "巧克力瑞纳冰" << endl; }
void add_burdening() { cout << "加奶油" << endl; }
};
//汉堡主类
class humberger {
public:
virtual void add_burdening() = 0;//加料
};
//牛肉堡
class beef :public humberger {
public:
void add_burdening() { cout << "不加辣" << endl; }
};
//鸡腿堡
class chicken :public humberger {
public:
void add_burdening() { cout << "微辣" << endl; }
};
//香辣堡
class piquancy :public humberger {
public:
void add_burdening() { cout << "巨辣" << endl; }
};
//接下来定义一台机器
template<class T1, class T2>
class abstractMachin {
public:
virtual void createMilk(T1* c) = 0;
virtual void createHumb(T2* c) = 0;
};
//机器具体实现
template<class T1,class T2>
class Machin :public abstractMachin<T1,T2> {
public:
void createMilk(T1* c) {
c->set_taste();
c->add_burdening();
}
void createHumb(T2* c) {
c->add_burdening();
}
};
int main()
{
//初始化一个机器
abstractMachin<Milk,humberger>* am = new Machin<Milk,humberger>();
//先做瑞纳冰
Milk* ruina = new ruinaice();
am->createMilk(ruina);
//再来个牛肉堡
abstractMachin<Milk,humberger>* bm = new Machin<Milk,humberger>();
beef* bf = new beef();
bm->createHumb(bf);
return 0;
}
遇到问题
我发现一个问题,就是如果要拓展一个业务,就得去添置新机器,好像也很合理啊,但是会影响到每一个机器,因为模板。
网上其他代码,不是用模板的,也逃不过这一劫,这就有点难受了。
抽象工厂模式
为创建一组相关或互相依赖的对象提供一个接口,而且无需指定它们的具体类。
喏,通用类图:
用武之地
优点
封装性。
产品族内为非公开状态。
缺点
难以拓展。
应用场景
非常简单:一个对象族,都有相同的约束,就可以用这个模式。什么意思呢?比方说汉堡和奶茶,都是用来吃的,但是具体实现过程不一样,那就可以,只要有可比性(都可以吃)就够。
当然,你要做好不打算拓展的心理准备。
要注意,都说它拓展困难,是对象族拓展困难,但是对象等级的拓展还是很简单的。
今天先到这儿啦,请期待明天的:模板方法模式