工厂方法(Factory-)模式
12 工厂措施(Factory Mthd)模式 工厂措施模式是类的创立模式,又叫虚拟构造子(VirtualConsructor)模式或者多态性工厂(olmorphicFacory)模式。 工厂措施模式的用意是定义一种创立产品对象的工厂接口,将实际工作推迟到子类中。 .2.1 工厂措施模式的引进 工厂措施模式是简朴工厂模式的进一步抽象和推广。由于使用了多态性,工厂措施模式保持了简朴工厂模式的长处,并且克服了它的缺陷。下面是工厂措施模式的缩略类图: 在工厂措施模式中,核心的工厂类不再负责所有产品的创立,而是将具体创立的工作交给子类去做。这个核心工厂则变为抽象工厂角色,仅负责给出具工厂子类必须实现的接口,而不接触哪一产品创立的细节。 这种抽象的成果,使这种工厂措施模式可以用来容许系统不修改具体工厂角色的状况下引进新产品,这一特点无疑使得工厂模式具有超过简朴工厂模式的优越性。 12.2 工厂措施模式的构造 在工厂措施模式中,一般均有一种平行的级别构造,也就是说工厂和产品是相应的的。抽象工厂相应抽象产品,具体工厂相应具体产品。简朴的示意图如下: 从上图可以看出,工厂措施模式的系统波及到了如下角色: 抽象工厂角色:与应用程序无关,任何在模式中创立对象的工厂必须实现这个接口。 具体工厂角色:实现了抽象工厂接口的具体Java类,具有与引用密切有关的逻辑,并且受到应用程序的调用以创立产品对象。 抽象产品角色:工厂措施所创立产品对象的超类型,也就是产品对象的共同父类或共同拥有的接口。 具体产品角色:这个角色实现了抽象产品角色所声名的接口。工厂措施所创立的每个具体产品对象都是某个具体产品角色的实例。 1.2.3 工厂措施模式在农场系统中的实现 .2.31 背景 在简朴工厂模式中,有个全能的园丁,控制所有作物的种植、生长和收获。目前农场规模变大了,管理更加专业化了。过去全能的园丁没有了,每一种作物均有专门的园丁管理,形成了规模化和专业化生产。 12.2 系统设计机构图 .2.3.3 实现源码 1.2.3.1 水果产品接口Frit.javpackage c.lavasoft.tens.fatoymhod.ybm;/* *工厂模式-工厂措施模式-一般性模式(农场应用) ReadMe: 水果接口 */pulic intrface ruit /* 种植 */ od lant(); /* * 生长 */ void gro(); / * 收获 * voidhrvest(); 1.3.2 具体产品苹果Ape.javapackage co.lasof.pters.fatorymehod.ybs;/* 工厂模式-工厂措施模式-一般性模式(农场应用) * ReadMe: 水果工厂的产品:苹果 */pbliccls ApeiplemetsFruit private int reA; /* 种植 */ publicid plant() ystout.pintl("Aplha been lated."); * *生长 / pulic voidgo() Ssem.o.prnln("ppe is gowin."); /* 收获 * publcvoidharvt() ytem.ourinln("Ale hs be harested."); /* * return 返回树龄 */ lc int gereeAg() ern treeAg; /* 设立树龄 */ pulic voidstTreeAge(it eeAg) this.treeAge = treAge; 1.2.3.3.3 具体产品葡萄:Gpe.jvapakage olavasoft.ptterns.facorymethod.yb;/* 工厂模式-工厂措施模式-一般性模式(农场应用) * eadMe: 水果工厂的产品:葡萄 */pubc cas Grape implemens Fu pivateoola sedes; /与否有籽 /* * 种植 */ ublic vd pat() Sste.out.prntln(rap has beenlanted."); * * 生长 */ pblc voidgro() Stem.outprntn("rap grow."); /* * 收获 */ public vidavst() System.t.rintln("Grae has been hrvested.); * * eturn 与否有籽 / ublola getSeedls() retn seedless; * * 有无籽的赋值措施 / pubic o sess(olean edess) this.eles seedles; /* 辅助措施 / pblic staic vdlog(Strigmsg) Sytem.ouprint(sg); 1.2.34 具体产品草莓:Strawberry.javapakagem.laof.ttrns.fatorymeto.ybms;/* * 工厂模式-工厂措施模式-一般性模式(农场应用) * eadM: 水果工厂的产品:草莓 /ubic clss Strwery ipements Fuit /* *生长 */ public void go() Sytem.printn("rery is groing."); * * 收获 * publivod haret() ystem.out.prinn("Srawrr has beenharveed."); /* *种植 / blc void pant() System.outintn("Srawbery hs been planted"); /* * 辅助措施 * plc stti void o(tring m) Syste.out.pritln(msg); 1.2.3.3.5 水果工厂接口:Fruitden.jvpacke com.lavasf.patrnfctoryetd.ym;* * 工厂模式-工厂措施模式-一般性模式(农场应用) * ReadM: 水果工厂接口 */pubic interfaceFrutarener /* * 工厂措施 * * retrn 水果 */ pubic Fritfactory(); 1.3.3 苹果工厂:ApleGareejavapackage com.lavasot.attrn.factrymetho.ybms;/* * 工厂模式-工厂措施模式-一般性模式(农场应用) * ReadMe: 苹果工厂措施 */pulic class AppleGarer imlements Fritarer * * 工厂措施 * rtu 苹果 */ puic Frui ct() ru f= nwAppl(); Sytem.outpnln("水果工厂(ApetGarener)成功创立一种水果:苹果!"); reurn ; 1. 葡萄工厂:rpGardeerjavpackageom.lavasoft.parnsfactormethodyms;/* * 工厂模式-工厂措施模式一般性模式(农场应用) Reade: 添加阐明 *pubi clss Gaeardener imlmnts FruitGardene /* 工厂措施 * reurn葡萄 */ public Fut acor() t f = ne Grp(); Sys.priln("水果工厂(Grapearener)成功创立一种水果:葡萄!"); retr f; 1.2.3. 草莓工厂:StawerryGener.vapacae com.lavasftpaten.factrymthdybms;/* *工厂模式-工厂措施模式-一般性模式(农场应用) *RedMe: 添加阐明 bic lsawrryGardeer iplemnts FruitGarener /* *工厂措施 * eturn 草莓 / ublic Fruit actory() rui f =e Stawberry(); Sstem.ut.printn("水果工厂(trwberyGardene)成功创立一种水果:草莓!"); et f; 123.3.9 测试类(客户端):TesAp.jaapackage om.aasoftpatterns.fatorymthod.b;/ * 工厂模式-工厂措施模式-一般性模式(农场应用) *Reae: 测试类(客户端) */pblc classesApp pite Fritrdeerf1,2, f; prveFruit p1, p, 3; pivae void te() /实力化水果工厂 1 newApplGrder(); f2 = ew Greardner(); f3 = ne StwberGrdener(); 从水果工厂生产水果 = f1.aoy(); p2 =f2.fcoy(); p3 = f3.facto(); ublicsi od ma(Srng rgs) Ttpp test = new TstApp(); es.tst(); .3.30 测试运营成果 水果工厂(pplGrdene)成功创立一种水果:苹果! 水果工厂(GpeGaree)成功创立一种水果:葡萄! 水果工厂(tawbrGadner)成功创立一种水果:草莓! rocess inshdwext o 0 1.2.3.4 有关工厂措施模式的实现 在下面我简朴说说某些实现方式,不做具体分析了。 1.使用java接口或者java抽象类l 使用多种工厂措施l .产品循环使用l 4.多态性的丧失和模式的退化,重要体目前工厂措施创立对象、工厂措施返回的类型、工厂级别构造三个方面。l 1.2.35 女娲举绳造人 女娲举绳造人是工厂措施模式的一种实例。下面仅仅给出设计图如下,具体编码请您自己实现。 呵呵,学会了简朴工厂模式再来学工厂措施,是不是很容易啊,看懂农场一种例子就够了,多实践多思考比什么都好!