




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 抽象工厂模式的倾斜性和改进设计研究 闫如海摘要:文章针对传统的抽象工厂模式的倾斜性进行了纠正,使得在生产不同产品族和不同产品等级结构时,新增产品等级结构不必修改源码,给出符合开闭原则的设计方案,同时对抽象工厂的缺点做了改进设计,以适应系统设计时搭建上层框架的需求。关键词:抽象工厂模式;倾斜性;设计模式;开闭原则;系统设计 :a:tp312 :1009-2374(2015)33-0018-02 doi:10.13535/ki.11-4406/n.2015.33.0101 概述抽象工厂模式源于面向对象设计领域里的经典教材设计模式,顾名思义,抽象
2、工厂模式用于系统运行时生产需要的对象,是一种创建型模式,在系统设计时是创建对象的核心模式。对于使用抽象工厂模式增加新产品的等级结构,学者们普遍认为必须要修改所有的工厂角色,只能以修改源码的方式新增新产品的等级结构,说明抽象工厂模式没有很好支持开闭原则(ocp),以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。这种方式也已不能够为制造业信息化和服务化服务,文中给出符合开闭原则的设计方案,同时对抽象工厂的缺点做了改进设计,以适应系统设计时搭建上层框架的需求。2 新增产品等级结构的设计如果已有产品等级a和b,产品族1和2,需要增加产品等级结
3、构c可以按图1所示进行:图1 新增产品等级结构的设计类图图中新增两大类内容,由虚线标注:第一,新增的产品等级结构c位于图下方,由三个类组成:abstractproductc、productc1、productc2。其中productc1、productc2都继承于abstractproductc。第二,工厂,这个是添加产品等级结构最重要的部分,由三部分组成:接口abstractfactoryc1、类concretefactoryc1、类concretefactoryc2。下面给出三个工厂的源码:工厂接口abstractfactoryc.javapublic interface abstract
4、factoryc extends abstractfactoryabstractproductc createproductc();实现工厂concretefactoryc1.javapublic class concretefactoryc1 extends concretefactory1 implements abstractfactorycoverridepublic abstractproductc createproductc()return new productc1();实现工厂concretefactoryc2.javapublic class concretefactory
5、c2 extends concretefactory2 implements abstractfactorycoverridepublic abstractproductc createproductc()return new productc2();第一,新增的工厂接口abstractfactoryc继承于abstractfactory,接口abstractfactoryc内新增了生产产品等级结构c的方法createproductc(),返回的类型是产品等级c。第二,新增两个工厂类concretefactoryc1和concretefactoryc2,其中concretefactoryc1继
6、承了concretefactory1类,从上面可以知道,concretefactory生产了产品族a1和b1,因为继承的关系,concretefactoryc1也有了这些功能。并且在类中生产了产品c1,支持了产品族1的生产。同理concretefactoryc2也完成了产品族2的生产功能。第三,完成客户端的调用,如下:public class clientpublic static void main(stringargs)abstractfactoryc cf1=new concretefactoryc1();cf1.createproductc();abstractfactoryc cf2
7、=new concretefactoryc2();cf2.createproductc();cf1能够生产对象c1,cf2可以生产对象c2。从这个设计可以看出没有改动图1中任何接口和类的源码,完全符合开闭原则(ocp),对系统内新增功能以新增类和接口方式完成。3 抽象工厂模式改进设计从以上内容可以看出抽象工厂模式并没有在新增产品等级时的所谓倾斜性的问题,但是这种模式还是有一些别的问题。这里需要对这些问题进行改进:第一,系统需要abstractproduct产品的子类时无法完成任务。在上面的设计中能看出,abstractfactory依赖abstractproducta,concretefact
8、ory1只负责生产abstractproducta的子类producta,client调用abstractfactory后获得abstractproducta。如果client需要producta继承于abstractproducta后新增的属性或方法,这个模式就无法正常运行,而producta中肯定有自己新定义的方法和属性,否则不需要新增子类,而且这些方法和属性必定会在系统某个地方使用,那么以工厂类为唯一生产对象的入口设计方案还是需要进行改进。改进的方法就是引入泛型。 第二,新增产品等级结构时工厂一侧的结构不易维护。上面的设计中新增产品等级c必须新加入抽象工厂abstractfactoryc
9、,再加入实现类concretefactoryc1和concretefactoryc2,产生了三个由继承而来的类,继承过多会造成耦合加剧,不利于维护。而且若新增次数增多则类规模会急速增大,产生很多冗余代码。这个问题的根源在于工厂一侧没有进行抽象设计,仅仅简单地做了方法提取。下面就这两个问题给出详细的改进设计。图2 改进设计类图新增接口iproduct,abstractproducta和abstractproductb都继承于它。这样就出现一个产品的基接口。引入泛型,修改abstractfactory代码如下:public interface abstractfactoryproduct crea
10、teproduct();新增接口abstractproducta:public interface abstractfactoryaextends abstractfactory这个接口产生对产品a的泛型依赖,因为还是泛型,子类在实现这个接口时就可以生产出abstractproducta的子类。最后实现工厂concretefactorya,这里只给出生产a1产品的代码,其余工厂类似,不再一一赘述。public class concretefactorya implements abstractfactoryaoverridepublic producta1 createproduct()return new producta1();4 结语本文通过对生产不同产品族和不同产品等级结构中新增产品等级结构的设计方案验证了抽象工厂模式不必修改源码也可以增加产品等级结构,同时也指出了相关设计时的注意事项,最后对抽象工厂
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025网络平台才艺主播专属展示合同范本
- 2025年家族房产共有权益分割与联合管理服务合同
- 2025年节能环保信报箱建设项目专用材料供应合同
- 2025乡村民宿托管经营合同收益分成与设施维护责任规定
- 2025年度企业年会云直播平台全方位现场直播与互动服务合同
- 2025年个人消费信用担保服务合同范本
- 2025环保先锋新能源汽车充电及长租服务合同范本
- 2025年全球多语种教育软件购买与教学资源共享协议
- 2025年城市公共交通系统规划咨询服务合同范本
- 2025年度云计算行业大数据分析应用研究合同
- HCT多线切割工艺
- GB 16912-2008深度冷冻法生产氧气及相关气体安全技术规程
- 化学药品地标升国标第四册
- 凤凰网公益频道先生访谈记录
- 锻造作业指导书
- DB15T 2748-2022 绿色电力应用评价方法
- 喹钼柠酮配制
- 厂房改造合同范本
- 25吨吊车起重性能表
- 娱乐场所从业人员信息登记表
- 地下水环境监测井施工设计方案
评论
0/150
提交评论