已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA工厂模式,工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。,工厂模式的几种形态,(1)简单工厂(SimpleFactory)模式,又称静态工厂方法模式(StaticFactoryMethodPattern)。(2)工厂方法(FactoryMethod)模式,又称多态性工厂(PolymorphicFactory)模式或虚拟构造子(VirtualConstructor)模式;(3)抽象工厂(AbstractFactory)模式,又称工具箱(Kit或Toolkit)模式。,简单工厂实例,比如说有一个农场公司,专门向市场销售各类水果。在这个系统里需要描述下列的水果:葡萄Grape草莓Strawberry苹果Apple水果与其他的植物有很大的不同,就是水果最终是可以采摘食用的。那么一个自然的作法就是建立一个各种水果都适用的接口,以便与农场里的其他植物区分开。,代码清单1:接口Fruit的源代码publicinterfaceFruit/*生长*/voidgrow();/*收获*/voidharvest();/*种植*/voidplant();,代码清单2:类Apple的源代码publicclassAppleimplementsFruitprivateinttreeAge;publicvoidgrow()log(Appleisgrowing.);publicvoidharvest()log(Applehasbeenharvested.);,publicvoidplant()log(Applehasbeenplanted.);publicstaticvoidlog(Stringmsg)System.out.println(msg);publicintgetTreeAge()returntreeAge;publicvoidsetTreeAge(inttreeAge)this.treeAge=treeAge;,代码清单3:类Grape的源代码publicclassGrapeimplementsFruitprivatebooleanseedless;publicvoidgrow()log(Grapeisgrowing.);publicvoidharvest()log(Grapehasbeenharvested.);publicvoidplant()log(Grapehasbeenplanted.);publicstaticvoidlog(Stringmsg)System.out.println(msg);publicbooleangetSeedless()returnseedless;publicvoidsetSeedless(booleanseedless)this.seedless=seedless;,类Strawberry的源代码publicclassStrawberryimplementsFruitpublicvoidgrow()System.out.println(Strawberryisgrowing.);publicvoidharvest()System.out.println(Strawberryhasbeenharvested.);publicvoidplant()System.out.println(Strawberryhasbeenplanted.);,FruitGardener类的源代码publicclassFruitGardenerpublicstaticFruitfactory(Stringwhich)throwsBadFruitExceptionif(which.equalsIgnoreCase(apple)returnnewApple();elseif(which.equalsIgnoreCase(strawberry)returnnewStrawberry();elseif(which.equalsIgnoreCase(grape)returnnewGrape();elsethrownewBadFruitException(Badfruitrequest);,简单工厂模式的结构,工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java类实现。抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java接口或者Java抽象类实现。具体产品(ConcreteProduct)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。,Creator类的源代码,publicclassCreatorpublicstaticProductfactory()returnnewConcreteProduct();,抽象角色Product接口的源代码,publicinterfaceProduct,具体产品角色ConcreteProduct类的源代码,publicclassConcreteProductimplementsProductpublicConcreteProduct(),多层次的产品结构,简单模式的优缺点,优点:模式的核心是工厂类。这个类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式通过这种做法实现了对责任的分割。,缺点(一):当产品类有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变,就是模式的缺点。这个工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类,有人把这种类叫做上帝类(GodClass)。如果这个全能类代表的是农场的一个具体园丁的话,那么这个园丁就需要对所有的产品负责,成了农场的关键人物,他什么时候不能正常工作了,整个农场都要受到影响。,缺点(二):当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难。,缺点(三):由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。,“开闭”原则,“开闭”原则要求一个系统的设计能够允许系统在无需修改的情况下,扩展其功能。简单工厂角色只在有限的程度上支持“开闭”原则。,工厂方法模式,工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。首先,在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。,工厂方法模式的结构,工厂方法模式的系统涉及到的角色,抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在上面的系统中这个角色由Java接口Creator扮演;在实际的系统中,这个角色也常常使用抽象Java类实现。具体工厂(ConcreteCreator)角色:担任这个角色的是实现了抽象工厂接口的具体Java类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。在本系统中给出了两个这样的角色,也就是具体Java类ConcreteCreator1和ConcreteCreator2。,工厂方法模式的系统涉及到的角色,抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在本系统中,这个角色由Java接口Product扮演;在实际的系统中,这个角色也常常使用抽象Java类实现。具体产品(ConcreteProduct)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。,实例(农场),工厂方法模式和简单工厂模式,工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。,工厂方法模式和简单工厂模式,与简单工厂模式中的情形一样的是,ConcreteCreator的factory()方法返还的数据类型是一个抽象类型Product,而不是哪一个具体产品类型,而客户端也不必知道所得到的产品的真实类型。这种多态性设计将工厂类选择创建哪一个产品对象、如何创建这个对象的细节完全封装在具体工厂类内部。对于增加新的产品类而言,这个系统完全支持“开-闭”原则。,抽象工厂模式,抽象工厂模式与工厂方法模式的区别,抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。,抽象工厂模式的结构,抽象工厂模式GOF95是对象的创建模式,它是工厂方法模式的进一步推广。假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式。这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。下面就以一个示意性的系统为例,说明这个模式的结构。,产品结构A和B,系统类图,抽象工厂模式涉及到的角色,抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用Java接口或者抽象Java类实现,而所有的具体工厂类必须实现这个Java接口或继承这个抽象Java类。具体工厂类(ConreteFactory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体Java类实现这个角色。,抽象工厂模式涉及到的角色,抽象产品(AbstractProduct)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java接口或者抽象Java类实现这一角色。具体产品(ConcreteProduct)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体Java类实现这个角色。,一般而言,有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法。每一个产品等级结构中有多少具体产品,就有多少个产品族,也就会在工厂等级结构中发现多少个具体工厂。,在什么情形下应当使用抽象工厂模式?,(1)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大型企业数字化转型的实施路径与管理优化研究
- 利润表结构优化与盈利增长驱动因素研究
- 2026中共北京市委党史研究室北京市地方志编纂委员会办公室所属事业单位招聘1人模拟试卷带答案详解(轻巧夺冠)
- 2026年宁波市鄞州区教育系统公开招聘事业编制教师39人模拟试卷带答案详解(巩固)
- 2026年福建厦门大学会计发展研究中心行政秘书招聘1人笔试题库附参考答案详解(B卷)
- 2026上海市伤骨科研究所工作人员公开招聘考前冲刺试卷带答案详解
- 2026江西省交投养护科技集团有限公司人文研究中心实习生招聘1人考前冲刺试卷及完整答案详解(全优)
- 2026四川成都中医药大学第二附属医院工作人员招聘35人备考题库及答案详解【夺冠系列】
- 2026福建三明市三元区市场监督管理局招聘公益性岗位1人笔试题库及答案详解【全优】
- 2026年福建厦门市集美职业技术学校非编教师招聘1人笔试题库附参考答案详解【夺分金卷】
- 华为GMDP领导力项目动员
- 2026年小学体育专任教师招聘考试笔试试题(含答案)
- 2026年佛山市顺德区(家电)知识产权快速维权中心公开招聘事业编制人员3人笔试备考试题及答案详解
- 2026 工程管理自来水公司招聘考试参考题库 含答案
- 广东东莞市2025-2026年学年下学期七年级语文阶段学情自测(试卷+解析)
- 医美院感工作制度
- JT-T-331.4-1996港口码头劳动定员标准集装箱码头-PDF解密
- JC-T 2104-2012水泥工业用耐磨件堆焊通用技术条件
- 咪达唑仑说明书
- WCM-支柱小组的角色
- 中国银行中银三星人寿保险有限公司2023年校园招聘50名人员笔试历年难、易错考点试题含答案解析
评论
0/150
提交评论