资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
学生姓名 学 号 院 系 专 业 年 级&九k学题目:抽象工厂模式张 婧201021077信息科学与技术学院计算机应用技术2010 级抽象工厂模式在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由 于需求的变化,往往存在着更多系列对象的创建工作。 如何应对这种变化?如何 绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和 这种“多系列具体对象创建工作”的紧耦合?这就要用到抽象工厂模式。抽象工 厂模式是简单工厂模式和工厂方法模式的升级版,它有更大的灵活性,同时也更加复杂一些。为了理解抽象工厂,我们考虑这样一个实际例子:如果你想吃饭了,怎么办自 己做吗?自己做就相当于程序中直接使用 new。当然是自己下个指令,别人来做 更爽。那就把做饭的任务交给厨师吧,那么他就是一个做饭的工厂了,你告诉他 要吃红烧肉,等会他就从厨房给你端出来一盘香喷喷的红烧肉了,再来个清蒸鱼吧。下图1就是这个问题的模型。會物1J-11 .!厨师图1显然到了这里,你是 Client ,厨师就是工厂,他拥有做红烧肉的方法, 做清蒸鱼的方法,这些方法返回值就是食物抽象。红烧肉、清蒸鱼就是食物的继 承类,简单工厂模式也成型了。简单工厂模式结构图2优点:允许客户端相对独立的创建产品的过程, 并且在系统引入新产品的时候无 需修改客户端。缺点:对修改不封闭,新增加产品您要修改工厂。违法了开闭法则(OCP。工厂方法模式生活例子:厨师手艺再好,总有不会做的菜,你想吃回锅肉,怎么办,让厨师学呗,于 是就给他新增了做回锅肉的方法,以后你再想吃一个新菜,就要给厨师新加一个 方法,显然此做法的缺点也就暴露出来了,用程序设计的描述就是对修改永远不 能封闭。面对上面对修改不能封闭的问题,有没有好的解决方案吗?把厨师抽象变 成一个基类,你请几个具体的厨师,分别有做清蒸鱼的,做红烧肉的厨师,如果 你想吃一个新菜,就再新找个厨师,从你的厨师基类继承一下,让他来做这个新 菜。现在来看这个模式发生了变化,结构中多了一个厨师的抽象,抽象并不具体 的加工产品了,至于做什么,是由这个抽象工厂的继承子类来实现, 现在的模式 也就变成工厂方法模式了,这个上面的结构图 1就变成了下面的图3的结构了。l.JL询出I| 工 i L d 1h() 白 Vf现在再来分析现在的模式,显然简单工厂的缺陷解决了,新增加一个菜只需要新增加一个厨师就行了,原来的厨师还在做原来的工作,这样你的设计就对 修改封闭了。工厂方法模式结构FAiTirttAi/Tfoit厂启* 姑i .?) ,j 优点:优化简单工厂模式,做到“开-闭”原则。可做到把具体的产品创建过程 延迟到具体的子类工厂。缺点:对于创建不同系列的产品无能为力。抽象工厂模式生活例子你发现菜可分成许多菜系,鲁菜、粤菜、湘菜等等,它们各有各的风味,同 样是红烧肉由不同菜系出来的味道也各不相同。 如果你的厨师都是鲁菜风味,广 东的朋友来了吃不惯,怎么办?现在我们再回到简单工厂模式,我们把红烧肉再向下继承,生成鲁菜红烧肉、 粤菜红烧肉、湘菜红烧肉;清蒸鱼向下继承为鲁菜清蒸鱼、粤菜清蒸鱼、湘菜清 蒸鱼。我们也修改一下厨师这个类,不让其返回食物基类,而是返回红烧肉、清 蒸鱼、这一层次,并把这些方法抽象化,作为菜系工厂基类,然后再从此基类继 承出,鲁菜工厂、粤菜工厂、湘菜工厂等等,再由这些具体工厂实现创建具体菜 的工作。图5现在可以看到,想新来做一个菜系,只需新聘请一个厨师就可以了,多么完美,但是你先别高兴太早,如果你想新增加一个菜就变得非常困难了。抽象工厂模式结构抽象工厂模式代码#in elude #in elude using n amespaee std;/红烧肉class CHon gshaoroupublic:virtual CH on gshaorou() ;/产品使用公共接口virtual void Start() = 0;/抽象基类,纯虚函数由派生类去实现;/鲁菜红烧肉class CHon gshaorouLucai : public CHon gshaoroupublic:CHon gshaorouLucai()cout 制作鲁菜红烧肉. endl;virtual CH on gshaorouLucai() ;virtual void Start()cout 鲁菜红烧肉好了 . endl;/粤菜红烧肉class CHon gshaorouYuecai : public CHon gshaoroupublic:CHon gshaorouYuecai()cout 制作粤菜红烧肉. endl;virtual CH on gshaorouYuecai() ;virtual void Start()cout 粤菜红烧肉好了 . endl;/清蒸鱼class Cqin gzhe ngyupublic:virtual Cq in gzhe ngyu() ;/产品使用公共接口virtual void Start() = 0;/抽象基类,纯虚函数由派生类去实现;/鲁菜清蒸鱼class Cqin gzhe ngyuLucai : public Cqin gzhe ngyupublic:Cqin gzhe ngyuLucai()cout 制作鲁菜清蒸鱼. endl;virtual Cq in gzhe ngyuLucai() ;virtual void Start()cout 鲁菜清蒸鱼好了 . endl;/粤菜清蒸鱼class Cqin gzhe ngyuYuecai : public Cqin gzhe ngyupublic:Cqin gzhe ngyuYuecai()cout 制作粤菜清蒸鱼. endl;virtual Cq in gzhe ngyuYuecai() ;virtual void Start()cout 粤菜清蒸鱼好了 . endl;;/抽象工厂class CFactorypublic:virtual CFactory();virtual CHon gshaorou* CreateH on gshaorou() = 0;virtual Cqin gzhe ngyu* Createq in gzhe ngyu() = 0;/鲁菜工厂class CLucaiFactory : public CFactorypublic:CLucaiFactory()cout 制作鲁菜工厂. endl;virtual CLucaiFactory();virtual CHon gshaorou* CreateH on gshaorou()retur n new CHon gshaorouLucai;virtual Cqin gzhe ngyu* Createq in gzhe ngyu()retur n new Cqin gzhe ngyuLucai;/粤菜工厂class CYuecaiFactory : public CFactorypublic:CYuecaiFactory()cout 制作粤菜工厂.CreateH on gshaorou();/ pqin gzhe ngyu = pFactory-Createq in gzhe ngyu(); pHon gshaorou-Start();pqi ngzhe ngyu-Start();delete pqin gzhe ngyu;delete pHon gshaorou;int main()CFactory* pFactory = NULL;/抽象工厂/鲁菜工厂。做红烧肉,清蒸鱼pFactory = new CLucaiFactory;/ 制作鲁菜工厂Test(pFactory);delete pFactory;coute ndl;/粤菜工厂。做红烧肉,清蒸鱼pFactory= new CYuecaiFactory;/制作粤菜工厂Test(pFactory);delete pFactory;system(pause);return 0;优点:将客户端与具体的类分离。一个产品系列中的多个对象被设计在一起工作, 能保证客户端始终只使用一个产品系列,且有利于更新产品系列。缺点:难以支持新品种产品。抽象工厂模式与工厂方法模式的区别a重点不同。工厂方法模式强调的是不同的创建者根据自身需求去生产不同的 具体产品,重点是生产具体产品;而抽象工厂模式则定位为“在不指定实体类别 的前提下,提供了一个可以创建一系列相关或互相依赖之组件的接口”,重点是创建相关组件。b工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式 的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。c工厂方法采用的是类继承机制(生成一个子类,重写该工厂方法,在该方法 中生产一个对象);而抽象工厂采用的是对象组合机制,专门定义“工厂”对象 来负责对象的创建。对象组合的方式就是把“工厂”对象作为参数传递。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号