版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、题目:抽象工厂模式学生姓名 张 婧 学 号 201021077 院 系 信息科学与技术学院 专 业 计算机应用技术 年 级 2010 级 抽象工厂模式在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就要用到抽象工厂模式。抽象工厂模式是简单工厂模式和工厂方法模式的升级版,它有更大的灵活性,同时也更加复杂一些。为了理解抽象工厂,我们考虑这样一个实际例子:如果你想吃饭了,怎么办自己做吗?自己做就相当于
2、程序中直接使用new。当然是自己下个指令,别人来做更爽。那就把做饭的任务交给厨师吧,那么他就是一个做饭的工厂了,你告诉他要吃红烧肉,等会他就从厨房给你端出来一盘香喷喷的红烧肉了,再来个清蒸鱼吧。下图 1 就是这个问题的模型。 图1 显然到了这里,你是Client,厨师就是工厂,他拥有做红烧肉的方法,做清蒸鱼的方法,这些方法返回值就是食物抽象。红烧肉、清蒸鱼就是食物的继承类,简单工厂模式也成型了。简单工厂模式结构 图2优点:允许客户端相对独立的创建产品的过程,并且在系统引入新产品的时候无需修改客户端。 缺点:对修改不封闭,新增加产品您要修改工厂。违法了开闭法则
3、(OCP)。工厂方法模式生活例子: 厨师手艺再好,总有不会做的菜,你想吃回锅肉,怎么办,让厨师学呗,于是就给他新增了做回锅肉的方法,以后你再想吃一个新菜,就要给厨师新加一个方法,显然此做法的缺点也就暴露出来了,用程序设计的描述就是对修改永远不能封闭。 面对上面对修改不能封闭的问题,有没有好的解决方案吗?把厨师抽象变成一个基类,你请几个具体的厨师,分别有做清蒸鱼的,做红烧肉的厨师,如果你想吃一个新菜,就再新找个厨师,从你的厨师基类继承一下,让他来做这个新菜。现在来看这个模式发生了变化,结构中
4、多了一个厨师的抽象,抽象并不具体的加工产品了,至于做什么,是由这个抽象工厂的继承子类来实现,现在的模式也就变成工厂方法模式了,这个上面的结构图1就变成了下面的图3的结构了。 图3 现在再来分析现在的模式,显然简单工厂的缺陷解决了,新增加一个菜只需要新增加一个厨师就行了,原来的厨师还在做原来的工作,这样你的设计就对修改封闭了。工厂方法模式结构 图4优点:优化简单工厂模式,做到“开-闭”原则。可做到把具体的产品创建过程延迟到具体的子类工厂。缺点:对于创建不同系列的产品无能为力。 抽象工厂模式生活例子 你发现菜可
5、分成许多菜系,鲁菜、粤菜、湘菜等等,它们各有各的风味,同样是红烧肉由不同菜系出来的味道也各不相同。如果你的厨师都是鲁菜风味,广东的朋友来了吃不惯,怎么办?现在我们再回到简单工厂模式,我们把红烧肉再向下继承,生成鲁菜红烧肉、粤菜红烧肉、湘菜红烧肉;清蒸鱼向下继承为鲁菜清蒸鱼、粤菜清蒸鱼、湘菜清蒸鱼。我们也修改一下厨师这个类,不让其返回食物基类,而是返回红烧肉、清蒸鱼、这一层次,并把这些方法抽象化,作为菜系工厂基类,然后再从此基类继承出,鲁菜工厂、粤菜工厂、湘菜工厂等等,再由这些具体工厂实现创建具体菜的工作。
6、60; 图5 现在可以看到,想新来做一个菜系,只需新聘请一个厨师就可以了,多么完美,但是你先别高兴太早,如果你想新增加一个菜就变得非常困难了。抽象工厂模式结构图6抽象工厂模式代码#include <iostream>#include <string>using namespace std;/红烧肉class CHongshaoroupublic: virtual CHongshaorou() ; /产品使用公共接口 virtual void Start() = 0;/抽象基类,纯虚函数由派生类
7、去实现; /鲁菜红烧肉class CHongshaorouLucai : public CHongshaoroupublic: CHongshaorouLucai() cout << "制作鲁菜红烧肉." << endl; virtual CHongshaorouLucai() ; virtual void Start() cout << "鲁菜红烧肉好了." << endl; ;/粤菜红烧肉class CHongshaorouYuecai : public CHongshaoroupublic: CHon
8、gshaorouYuecai() cout << "制作粤菜红烧肉." << endl; virtual CHongshaorouYuecai() ; virtual void Start() cout << "粤菜红烧肉好了." << endl; ; /清蒸鱼class Cqingzhengyupublic: virtual Cqingzhengyu() ; /产品使用公共接口 virtual void Start() = 0;/抽象基类,纯虚函数由派生类去实现; /鲁菜清蒸鱼class Cqingzhe
9、ngyuLucai : public Cqingzhengyupublic: CqingzhengyuLucai() cout << "制作鲁菜清蒸鱼." << endl; virtual CqingzhengyuLucai() ; virtual void Start() cout << "鲁菜清蒸鱼好了." << endl; ; /粤菜清蒸鱼class CqingzhengyuYuecai : public Cqingzhengyupublic: CqingzhengyuYuecai() cout &l
10、t;< "制作粤菜清蒸鱼." << endl; virtual CqingzhengyuYuecai() ; virtual void Start() cout << "粤菜清蒸鱼好了." << endl; ;/抽象工厂class CFactorypublic: virtual CFactory(); virtual CHongshaorou* CreateHongshaorou() = 0; virtual Cqingzhengyu* Createqingzhengyu() = 0;/鲁菜工厂class CLu
11、caiFactory : public CFactorypublic: CLucaiFactory() cout << "制作鲁菜工厂." << endl; virtual CLucaiFactory(); virtual CHongshaorou* CreateHongshaorou() return new CHongshaorouLucai; ; virtual Cqingzhengyu* Createqingzhengyu() return new CqingzhengyuLucai; ;/粤菜工厂class CYuecaiFactory :
12、 public CFactorypublic: CYuecaiFactory() cout << "制作粤菜工厂." << endl; virtual CYuecaiFactory(); virtual CHongshaorou* CreateHongshaorou() return new CHongshaorouYuecai; ; virtual Cqingzhengyu* Createqingzhengyu() return new CqingzhengyuYuecai; ;void Test(CFactory* pFactory) CHong
13、shaorou* pHongshaorou = NULL; Cqingzhengyu* pqingzhengyu = NULL; pHongshaorou = pFactory->CreateHongshaorou();/制作红烧肉 pqingzhengyu = pFactory->Createqingzhengyu();/制作清蒸鱼 pHongshaorou->Start(); pqingzhengyu->Start(); delete pqingzhengyu; delete pHongshaorou;int main() CFactory* pFactory =
14、NULL;/抽象工厂 /鲁菜工厂。做红烧肉,清蒸鱼 pFactory = new CLucaiFactory;/制作鲁菜工厂 Test(pFactory); delete pFactory; cout<<endl; /粤菜工厂。做红烧肉,清蒸鱼 pFactory= new CYuecaiFactory;/制作粤菜工厂 Test(pFactory); delete pFactory; system("pause"); return 0;优点:将客户端与具体的类分离。一个产品系列中的多个对象被设计在一起工作,能保证客户端始终只使用一个产品系列,且有利于更新产品系列。缺点:难以支持新品种产品。抽象工厂模式与工厂方法模式的区别 a重点不同。工厂方法模式强调的是不同的创建者根据自身需求去生产不同的具体产品,重点是生产具体产品;而抽象工厂模式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园心理健康合同:校园心理健康服务承包协议
- 新疆维吾尔自治区劳动合同范本样本
- 山林承包合同使用指南
- 2024年范文生态园土地承包合同
- 2024试析《物业服务合同》的解除或终止问题
- 2024小吃加盟合同范本
- 物业管理服务协议参考样本
- 个人建房施工合同范本
- 2024广告设计类合同范本
- 解除版权买卖合同协议
- 期刊编辑的学术期刊编辑规范考核试卷
- T-CCSAS014-2022《化工企业承包商安全管理指南》
- 电梯安全总监和安全员的任命文件
- SL-T+62-2020水工建筑物水泥灌浆施工技术规范
- 2024年安徽省普通高中学业水平选择性考试 历史试卷
- 电子商务师职业技能等级证书培训方案
- JBT 14615-2024 内燃机 活塞运动组件 清洁度限值及测定方法(正式版)
- DL5009.2-2013电力建设安全工作规程第2部分:电力线路
- 理智与情感:爱情的心理文化之旅智慧树知到期末考试答案章节答案2024年昆明理工大学
- GA/T 2097-2023执法办案管理场所信息应用技术要求
- GB 20052-2024电力变压器能效限定值及能效等级
评论
0/150
提交评论