




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
注:文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。Abstract Factory模式强调的是系列产品的替换,或者说系列产品的创建。抽像工厂和一般的工厂各有优缺点:对于,普通工厂来说,我们是可以扩展产品的(Product和Product Factory),但是对于产生产品系列来说非常麻烦,会导致工厂泛滥。对对,抽像工厂来说,对于产生产品系统非常方便,但对于产生产品品种来说,需要改动的地方比较多。(现在并没有兼具普通工厂和抽像工厂的解决方案)Spring提供了一个简单的解决方案:BeanFactoryAbstract Factory模式(抽象工厂模式)(参考自:/woods2001/article/details/6655083)抽象工厂,是简单工厂和工厂方法的升级版。相比这两个模式,抽象工厂有这更大的灵活性,同时也更加复杂一些。抽象工厂模式的实质是“提供接口,创建一系列相关或独立的对象,而不指定这些对象的具体类。”1结构理解1.AbstractFactory是抽象工厂类,声明创建产品族的接口。具体工厂创建具体的产品族(ProductFamily),可以创建出分属于不同产品等级的一个产品族中的所有对象。ConcreteFactory1和ConcreteFactory2分别生产2个不同产品族。(比如游戏关卡里同一级别的不同怪物?)举例:手机工厂生产的产品族中,产品有Linux系统的手机和Windows系统的手机。PC工厂生产的产品族中,产品有Linux系统的PC和Windows系统的PC。(两个产品族:手机产品族和PC产品族)2.AbstractProductA和AbstractProductB是产品基类。它们的派生类是同产品等级结构(产品类型)的具的体产品。举例:Linux的具体产品类型包括Linux手机版和Linux PC版,Windows的具体产品类型包括Windows手机版和Windows PC版。产品族和产品等级的关系:从上图可以看出,4个具体工厂,每个产品族有3个不同类型的产品,可以生产具体产品4*3=12中具体产品。而对于工厂方法模式,生产12中产品,需要有12个工厂。3.调用者(Client)只能看到抽象层次接口。要点1.抽象工厂应用场景:一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库,而只想显示它们的接口而不是实现时。2.新增产品复杂。抽象工厂增加产品组件时,需要更改所有工厂的接口。如增加产品ProductC,则工厂基类和具体工厂需要增加接口CreateProductC。3.抽象工厂模式与工厂方法模式的区别。a重点不同。工厂方法模式强调的是不同的创建者根据自身需求去生产不同的具体产品,重点是生产具体产品;而抽象工厂模式则定位为“在不指定实体类别的前提下,提供了一个可以创建一系列相关或互相依赖之组件的接口”,重点是创建相关组件。b抽象工厂提供了的“相关组件”可以看成是具体的产品(如ProductA1),抽象工厂模式的“相关组件”可由工厂模式实现。ConcreteFactory1.CreateProuductA()生产的具体产品,可以用工厂方法模式实现,即每一个产品用一个工厂方法实现。c工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。d抽象工厂不能直接创建产品,只能创建工厂,即抽象工厂创建的产品是工厂。虽然它也定义了创建产品的方法,但需要创建出来的具体的工厂实现,即抽象工厂创建出的工厂创建产品。e工厂方法采用的是类继承机制(生成一个子类,重写该工厂方法,在该方法中生产一个对象);而抽象工厂采用的是对象组合机制,专门定义“工厂”对象来负责对象的创建。对象组合的方式就是把“工厂”对象作为参数传递。应用抽象工厂模式可应用:支持多种数据库的数据库接口访问层;界面设计各种风格界面等。源码中通过PC工厂和手机工厂和预装的操作系统产品来举例实现模式。源码#include#includeusingnamespacestd;/产品classCLinuxpublic:virtualCLinux() ;/产品使用公共接口virtualvoidStart() = 0;classCLinuxMobile:publicCLinuxpublic:CLinuxMobile() coutcreate linux mobile.endl; virtualCLinuxMobile() ;virtualvoidStart() coutlinux mobile start.endl; ;classCLinuxPC:publicCLinuxpublic:CLinuxPC() coutcreate linux PC.endl; virtualCLinuxPC() ;virtualvoidStart() coutlinux PC start.endl; ;classCWindowspublic:virtualCWindows() ;/产品使用公共接口virtualvoidStart() = 0;classCWindowsMobile:publicCWindowspublic:CWindowsMobile() coutcreate windows mobile.endl; virtualCWindowsMobile() ;virtualvoidStart() coutwindows mobile start.endl; ;classCWindowsPC:publicCWindowspublic:CWindowsPC() coutcreate windows PC.endl; virtualCWindowsPC() ;virtualvoidStart() coutwindows PC start.endl; ;/工厂classCFactorypublic:virtualCFactory();/产品族有个产品组件virtualCLinux*CreateLinux() = 0;virtualCWindows*CreateWindows() = 0;classCMobileFactory:publicCFactorypublic:CMobileFactory() coutcreate mobile factory.endl; virtualCMobileFactory();virtualCLinux*CreateLinux() returnnewCLinuxMobile; ;virtualCWindows*CreateWindows() returnnewCWindowsMobile;classCPCFactory:publicCFactorypublic:CPCFactory() coutcreate PC factory.CreateLinux();pWindows=pFactory-CreateWindows();pLinux-Start();pWindows-Start();deletepWindows;deletepLinux;intmain()CFactory*pFactory=NULL; /手机工厂。生产手机产品族,种类有Linux和WindowspFactory=newCMobileFactory;Test(pFactory);deletepFactory;coutendl;/PC工厂。生产PC产品族,种类有Linux和WindowspFactory=newCPCFactory;Test(pFactory);deletepFactory;system(pause);return0;输出:create mobile factory.create linux mobile.create windows mobile.linux mobile start.windows mobile start.create PC factory.create linux PC.create windows PC.linux PC start.windows PC start.为了方便理解,下面再举一个例子(参考自:/emptysoul/archive/2009/02/23/73176.html?opt=admin)我们现在要生产电脑产品,假设电脑产品现在只有台式机及笔记本两种,我们需要建一个工厂用来生产电脑产品,而工厂中可以生产不同品牌的电脑,对于每个品牌,我们分别建立相应的品牌工厂,负责生产各自的品牌产品,假设现在有DELL及IBM两个品牌工厂,那么现在每个工厂都可以生产各自的台式机及笔记本了。其类图如下:以下是实现代码:/DesktopProduct.hclassDesktopProductpublic:virtualDesktopProduct();protected:DesktopProduct();/DesktopProduct.cpp#includestdafx.h#includeDesktopProduct.hDesktopProduct:DesktopProduct()DesktopProduct:DesktopProduct()/DELLDesktopProduct.h#includeDesktopProduct.hclassDELLDesktopProduct:publicDesktopProductpublic:DELLDesktopProduct();virtualDELLDesktopProduct();/DELLDesktopProduct.cpp#includestdafx.h#includeDELLDesktopProduct.h#includeusingnamespacestd;DELLDesktopProduct:DELLDesktopProduct()cout创建DELL台式机endl;DELLDesktopProduct:DELLDesktopProduct()/IBMDesktopProduct.h#includeDesktopProduct.hclassIBMDesktopProduct:publicDesktopProductpublic:IBMDesktopProduct();virtualIBMDesktopProduct();/IBMDesktopProduct.cpp#includestdafx.h#includeIBMDesktopProduct.h#includeusingnamespacestd;IBMDesktopProduct:IBMDesktopProduct()cout创建IBM台式机endl;IBMDesktopProduct:IBMDesktopProduct()/NotebookProduct.hclassNotebookProductpublic:virtualNotebookProduct();protected:NotebookProduct();/NotebookProduct.cpp#includestdafx.h#includeNotebookProduct.hNotebookProduct:NotebookProduct()NotebookProduct:NotebookProduct()/DELLNotebookProduct.h#includeNotebookProduct.hclassDELLNotebookProduct:publicNotebookProductpublic:DELLNotebookProduct();virtualDELLNotebookProduct();/DELLNotebookProduct.cpp#includestdafx.h#includeDELLNotebookProduct.h#includeusingnamespacestd;DELLNotebookProduct:DELLNotebookProduct()cout创建DELL笔记本endl;DELLNotebookProduct:DELLNotebookProduct()/IBMNotebookProduct.h#includeNotebookProduct.hclassIBMNotebookProduct:publicNotebookProductpublic:IBMNotebookProduct();virtualIBMNotebookProduct();/IBMN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗核心制度考核试题题库及答案
- 2025年工业互联网平台AR交互技术在远程协作中的应用案例分析报告
- 押题宝典高校教师资格证之《高等教育法规》试题及答案详解(夺冠系列)
- 2025年新零售行业智能收银系统与顾客体验研究报告
- 2025年民办教育机构合规运营与品牌建设教育服务品牌品牌管理优化报告
- 2025至2030年中国整体精装市场调查研究及行业投资潜力预测报告
- 2025年企业劳动争议仲裁与代理服务合同范本
- 2025版节能环保型内外墙抹灰施工与验收合同
- 2025版商标转让及许可交易合同范本
- 2025年度校园安全监控设备承包安装合同
- 电子信息类专业导论课程总结
- 麻醉科质控管理规范
- 2013年7月版工业管道全面检验报告填写说明 2014
- 纺织行业主要工艺流程和用水环节
- 《大数据金融》教学大纲(第六学期)附课程考核标准
- 德国工业标准DIN8077聚丙烯(PP)管材尺寸赵彦波
- 大学团支书竞选ppt
- 拖拉机和联合收割机查验记录表
- Q∕GDW 12070-2020 配电网工程标准化设计图元规范
- 注塑机各部件的中英文名称和作用
- 环氧金磨石施工方案
评论
0/150
提交评论