抽象工厂模式Word格式.docx
- 文档编号:18989617
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:11
- 大小:366.36KB
抽象工厂模式Word格式.docx
《抽象工厂模式Word格式.docx》由会员分享,可在线阅读,更多相关《抽象工厂模式Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
当然是自己下个指令,别人来做更爽。
那就把做饭的任务交给厨师吧,那么他就是一个做饭的工厂了,你告诉他要吃红烧肉,等会他就从厨房给你端出来一盘香喷喷的红烧肉了,再来个清蒸鱼吧。
下图1就是这个问题的模型。
图1
显然到了这里,你是Client,厨师就是工厂,他拥有做红烧肉的方法,做清蒸鱼的方法,这些方法返回值就是食物抽象。
红烧肉、清蒸鱼就是食物的继承类,简单工厂模式也成型了。
简单工厂模式结构
图2
优点:
允许客户端相对独立的创建产品的过程,并且在系统引入新产品的时候无需修改客户端。
缺点:
对修改不封闭,新增加产品您要修改工厂。
违法了开闭法则(OCP)。
工厂方法模式生活例子:
厨师手艺再好,总有不会做的菜,你想吃回锅肉,怎么办,让厨师学呗,于是就给他新增了做回锅肉的方法,以后你再想吃一个新菜,就要给厨师新加一个方法,显然此做法的缺点也就暴露出来了,用程序设计的描述就是对修改永远不能封闭。
面对上面对修改不能封闭的问题,有没有好的解决方案吗?
把厨师抽象变成一个基类,你请几个具体的厨师,分别有做清蒸鱼的,做红烧肉的厨师,如果你想吃一个新菜,就再新找个厨师,从你的厨师基类继承一下,让他来做这个新菜。
现在来看这个模式发生了变化,结构中多了一个厨师的抽象,抽象并不具体的加工产品了,至于做什么,是由这个抽象工厂的继承子类来实现,现在的模式也就变成工厂方法模式了,这个上面的结构图1就变成了下面的图3的结构了。
图3
现在再来分析现在的模式,显然简单工厂的缺陷解决了,新增加一个菜只需要新增加一个厨师就行了,原来的厨师还在做原来的工作,这样你的设计就对修改封闭了。
工厂方法模式结构
图4
优化简单工厂模式,做到“开-闭”原则。
可做到把具体的产品创建过程延迟到具体的子类工厂。
对于创建不同系列的产品无能为力。
抽象工厂模式生活例子
你发现菜可分成许多菜系,鲁菜、粤菜、湘菜等等,它们各有各的风味,同样是红烧肉由不同菜系出来的味道也各不相同。
如果你的厨师都是鲁菜风味,广东的朋友来了吃不惯,怎么办?
现在我们再回到简单工厂模式,我们把红烧肉再向下继承,生成鲁菜红烧肉、粤菜红烧肉、湘菜红烧肉;
清蒸鱼向下继承为鲁菜清蒸鱼、粤菜清蒸鱼、湘菜清蒸鱼。
我们也修改一下厨师这个类,不让其返回食物基类,而是返回红烧肉、清蒸鱼、这一层次,并把这些方法抽象化,作为菜系工厂基类,然后再从此基类继承出,鲁菜工厂、粤菜工厂、湘菜工厂等等,再由这些具体工厂实现创建具体菜的工作。
图5
现在可以看到,想新来做一个菜系,只需新聘请一个厨师就可以了,多么完美,但是你先别高兴太早,如果你想新增加一个菜就变得非常困难了。
抽象工厂模式结构
图6
抽象工厂模式代码
#include<
iostream>
string>
usingnamespacestd;
//红烧肉
classCHongshaorou
{
public:
virtual~CHongshaorou(){};
//产品使用公共接口
virtualvoidStart()=0;
//抽象基类,纯虚函数由派生类去实现
};
//鲁菜红烧肉
classCHongshaorouLucai:
publicCHongshaorou
CHongshaorouLucai()
{
cout<
<
"
制作鲁菜红烧肉."
<
endl;
}
virtual~CHongshaorouLucai(){};
virtualvoidStart()
鲁菜红烧肉好了."
};
//粤菜红烧肉
classCHongshaorouYuecai:
CHongshaorouYuecai()
制作粤菜红烧肉."
virtual~CHongshaorouYuecai(){};
粤菜红烧肉好了."
//清蒸鱼
classCqingzhengyu
virtual~Cqingzhengyu(){};
//鲁菜清蒸鱼
classCqingzhengyuLucai:
publicCqingzhengyu
CqingzhengyuLucai()
制作鲁菜清蒸鱼."
virtual~CqingzhengyuLucai(){};
鲁菜清蒸鱼好了."
//粤菜清蒸鱼
classCqingzhengyuYuecai:
CqingzhengyuYuecai()
制作粤菜清蒸鱼."
virtual~CqingzhengyuYuecai(){};
粤菜清蒸鱼好了."
//抽象工厂
classCFactory
virtual~CFactory(){};
virtualCHongshaorou*CreateHongshaorou()=0;
virtualCqingzhengyu*Createqingzhengyu()=0;
//鲁菜工厂
classCLucaiFactory:
publicCFactory
CLucaiFactory()
制作鲁菜工厂."
virtual~CLucaiFactory(){};
virtualCHongshaorou*CreateHongshaorou()
returnnewCHongshaorouLucai;
virtualCqingzhengyu*Createqingzhengyu()
returnnewCqingzhengyuLucai;
};
//粤菜工厂
classCYuecaiFactory:
CYuecaiFactory()
制作粤菜工厂."
virtual~CYuecaiFactory(){};
returnnewCHongshaorouYuecai;
returnnewCqingzhengyuYuecai;
voidTest(CFactory*pFactory)
CHongshaorou*pHongshaorou=NULL;
Cqingzhengyu*pqingzhengyu=NULL;
pHongshaorou=pFactory->
CreateHongshaorou();
//制作红烧肉
pqingzhengyu=pFactory->
Createqingzhengyu();
//制作清蒸鱼
pHongshaorou->
Start();
pqingzhengyu->
deletepqingzhengyu;
deletepHongshaorou;
intmain()
CFactory*pFactory=NULL;
//鲁菜工厂。
做红烧肉,清蒸鱼
pFactory=newCLucaiFactory;
//制作鲁菜工厂
Test(pFactory);
deletepFactory;
cout<
endl;
//粤菜工厂。
pFactory=newCYuecaiFactory;
//制作粤菜工厂
system("
pause"
);
return0;
}
将客户端与具体的类分离。
一个产品系列中的多个对象被设计在一起工作,能保证客户端始终只使用一个产品系列,且有利于更新产品系列。
难以支持新品种产品。
抽象工厂模式与工厂方法模式的区别
a.重点不同。
工厂方法模式强调的是不同的创建者根据自身需求去生产不同的具体产品,重点是生产具体产品;
而抽象工厂模式则定位为“在不指定实体类别的前提下,提供了一个可以创建一系列相关或互相依赖之组件的接口”,重点是创建相关组件。
b.工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
c.工厂方法采用的是类继承机制(生成一个子类,重写该工厂方法,在该方法中生产一个对象);
而抽象工厂采用的是对象组合机制,专门定义“工厂”对象来负责对象的创建。
对象组合的方式就是把“工厂”对象作为参数传递。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 抽象 工厂 模式