浅析java常用的设计模式_第1页
浅析java常用的设计模式_第2页
浅析java常用的设计模式_第3页
浅析java常用的设计模式_第4页
浅析java常用的设计模式_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、工厂模模式:客客户类和和工厂类类分开。消消费者任任何时候候需要某某种产品品,只需需向工厂厂请求即即可。消消费者无无须修改改就可以以接纳新新产品。缺缺点是当当产品修修改时,工工厂类也也要做相相应的修修改。如:如何创创建及如如何向客客户端提提供。 2、建建造模式式:将产产品的内内部表象象和产品品的生成成过程分分割开来来,从而而使一个个建造过过程生成成具有不不同的内内部表象象的产品品对象。建建造模式式使得产产品内部部表象可可以独立立的变化化,客户户不必知知道产品品内部组组成的细细节。建建造模式式可以强强制实行行一种分分步骤进进行的建建造过程程。 33、工厂厂方法模模式:核核心工厂厂类不再再负责所

2、所有产品品的创建建,而是是将具体体创建的的工作交交给子类类去做,成成为一个个抽象工工厂角色色,仅负负责给出出具体工工厂类必必须实现现的接口口,而不不接触哪哪一个产产品类应应当被实实例化这这种细节节。 44、原始始模型模模式:通通过给出出一个原型对对象来指指明所要要创建的的对象的的类型,然然后用复复制这个个原型对对象的方方法创建建出更多多同类型型的对象象。原始始模型模模式允许许动态的的增加或或减少产产品类,产产品类不不需要非非得有任任何事先先确定的的等级结结构,原原始模型型模式适适用于任任何的等等级结构构。缺点点是每一一个类都都必须配配备一个个克隆方方法。 5、单单例模式式:单例例模式确确保某一

3、一个类只只有一个个实例,而而且自行行实例化化并向整整个系统统提供这这个实例例单例模模式。单单例模式式只应在在有真正正的“单单一实例例”的需需求时才才可使用用。 6、适适配器(变变压器)模模式:把把一个类类的接口口变换成成客户端端所期待待的另一一种接口口,从而而使原本本因接口口原因不不匹配而无法一一起工作作的两个个类能够够一起工工作。适适配类可可以根据据参数返返还一个个合适的的实例给给客户端端。 77、桥梁梁模式:将抽象象化与实实现化脱脱耦,使使得二者者可以独独立的变变化,也也就是说说将他们们之间的的强关联联变成弱弱关联,也也就是指指在一个个软件系系统的抽抽象化和和实现化化之间使使用组合合/聚合

4、合关系而而不是继继承关系系,从而而使两者者可以独独立的变变化。 8、合合成模式式:合成成模式将将对象组组织到树树结构中中,可以以用来描描述整体体与部分分的关系系。合成成模式就就是一个个处理对对象的树树结构的的模式。合合成模式式把部分分与整体体的关系系用树结结构表示示出来。合合成模式式使得客客户端把把一个个个单独的的成分对对象和由由他们复合而成成的合成成对象同同等看待待。 99、装饰饰模式:装饰模模式以对对客户端端透明的的方式扩扩展对象象的功能能,是继继承关系系的一个个替代方方案,提提供比继继承更多多的灵活活性。动动态给一一个对象象增加功功能,这这些功能能可以再再动态的的撤消。增增加由一一些基本

5、本功能的的排列组组合而产产生的非非常大量量的功能能。 110、门门面模式式:外部部与一个个子系统统的通信信必须通通过一个个统一的的门面对对象进行行。门面面模式提提供一个个高层次次的接口口,使得得子系统统更易于于使用。每每一个子子系统只只有一个个门面类类,而且且此门面面类只有有一个实实例,也也就是说说它是一一个单例例模式。但但整个系系统可以以有多个个门面类类。 111、享享元模式:FLYYWEIIGHTT在拳击击比赛中中指最轻轻量级。享享元模式式以共享享的方式式高效的的支持大大量的细细粒度对对象。享享元模式式能做到到共享的的关键是是区分内内蕴状态态和外蕴蕴状态。内内蕴状态态存储在在享元内内部,不

6、不会随环环境的改改变而有有所不同同。外蕴蕴状态是是随环境境的改变变而改变变的。外外蕴状态态不能影影响内蕴蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。 12、代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对

7、象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。 13、责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接 起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。 14、命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执

8、行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。 15、解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个

9、解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。 16、迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。 17、调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发

10、生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。 18、备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。 19、观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自

11、动更新自己。 20、状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。 21、策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为

12、类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。 22、模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。 23、访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合

13、解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。工厂模式的的几种形形态:1、简单工工厂模式式,又叫叫做静态态工厂方方法(SStattic Facctorry MMethhod)模式。 2、工厂方方法模式式,又称称为多态态性工厂厂(Poolymmorpphicc Faactoory)模式 3、抽象工工厂模式式,又称称工

14、具(KKit或或TooolKiit)模模式 简单工厂模模式(SSimpple Faactoory) 1、模式: 简单工厂模模式是类类的创建建模式,又又叫做静静态工厂厂方法(SStattic Facctorry MMethhod)模模式。 它是由一个个工厂对对象决定定创建出出哪一种种产品类类的实例例。 Java代代码 1.2、举举例: 2. /水果果接口 3. ppubllic intterffacee Frruitt 4. voiid ggroww(); /生长长 5. voiid hharvvestt(); /收获 6. voiid pplannt(); /种植植 7. 8. 9. /苹果果

15、类 10. pubblicc cllasss Appplee immpleemennts Fruuit 11. prrivaate intt trreeAAge /树树龄 12. 13. puubliic vvoidd grrow() 14. loog(Appple is groowinng.); 15. 16. 17. puubliic vvoidd haarveest() 18. llog(Appplee haas bbeenn haarveenteed.); 19. 20. 21. puubliic vvoidd pllantt() 22. logg(AApplle hhas beeen

16、 pplanntedd.); 23. 24. 25. /辅助方方法 26. puubliic sstattic voiid llog(Strringg mssg) 27. SSysttem.outt.prrinttln(msgg); 28. 29. 30. puubliic iint gettTreeeAgge() 31. rretuurn treeeAgge; 32. 33. 34. puubliic vvoidd seetTrreeAAge(intt trreeAAge) 35. tthiss.trreeAAge = ttreeeAgee; 36. 37. 38. 39. /葡葡萄类 40

17、. pubblicc cllasss Grrapee immpleemennts Fruuit 41. prrivaate boooleaan sseeddlesss; 42. 43. puubliic vvoidd grrow() 44. llog(Grrapee iss grrowiing.); 45. 46. 47. puubliic vvoidd haarveest() 48. llog(Grrapee haas bbeenn haarveesteed.); 49. 50. 51. puubliic vvoidd pllantt() 52. llog(Grrapee haas bbee

18、nn pllantted.); 53. 54. 55. puubliic sstattic voiid llog(Strringg mssg) 56. SSysttem.outt.prrinttln(msgg); 57. 58. 59. /有无籽籽方法 60. puubliic bboolleann geetSeeedllesss() 61. rretuurn seeedleess; 62. 63. 64. puubliic vvoidd seetSeeedlleess(boooleean seeedleess) 65. tthiss.seeedllesss = seeedleess; 66.

19、 67. 68. 69. /草草莓类 70. pubblicc cllasss Sttrawwberrry impplemmentts FFruiit 71. puubliic vvoidd grrow() 72. llog(Sttrawwberrry is groowinng.); 73. 74. 75. puubliic vvoidd haarveest() 76. llog(Sttrawwberrry hass beeen harrvesstedd.); 77. 78. 79. puubliic vvoidd pllantt() 80. llog(Sttrawwberrry hass b

20、eeen plaanteed.); 81. 82. 83. puubliic sstattic voiid llog(Strringg mssg) 84. SSysttem.outt.prrinttln(msgg); 85. 86. 87. 88. /农农场园丁丁类,由由他决定定创建哪哪种水果果类的实实例 89. pubblicc cllasss FrruittGarrdenner 90. /静态工工厂方法法 91. puubliic sstattic Fruuit facctorry(SStriing whiich) thhrowws BBadFFruiitExxcepptioon 92.

21、iif(wwhicch.eequaalsllgnooreCCasee(aapplle) 93. retturnn neew AApplle(); 94. elsse iif(wwhicch.eequaalsllgnooreCCasee(ggrappe) 95. retturnn neew GGrappe(); 96. elsse iif(wwhicch.eequaalsllgnooreCCasee(sstraawbeerryy) 97. retturnn neew SStraawbeerryy(); 98. elsse 99. thrrow neww BaadFrruittExccepttio

22、nn(BBad fruuit reqquesst); 100. 101. 102. 103. 104. /异常类类 105. puubliic cclasss BBadFFruiitExxcepptioon eexteendss Exxcepptioon 106. ppubllic BaddFruuitEExceeptiion(Strringg mssg) 107. supper(msgg); 108. 109. 110. 111. /测试类类 112. puubliic cclasss TTestt 113. FFruiitGaardeenerr gaardeenerr =nnew Fruu

23、itGGarddeneer(); 114. ttry 115. garrdenner.facctorry(graape); 116. garrdenner.facctorry(appple); 117. garrdenner.facctorry(strrawbberrry); 118. garrdenner.facctorry(bannanaa); /抛出异异常 119. cattch(BaddFruuitEExceeptiion e) 120. Sysstemm.ouut.pprinntlnn(ddonttt hass thhis fruuit.); 121. 122. 123. 2、举例:

24、/水水果接口口pubblicc innterrfacce FFruiitvooid groow();/生生长vooid harrvesst();/收收获vooid plaant();/种种植/苹苹果类pubblicc cllasss Appplee immpleemennts Fruuitprrivaate intt trreeAAge/树树龄puubliic vvoidd grrow()llog(Appplee iss grrowiing.);puubliic vvoidd haarveest()llog(Appplee haas bbeenn haarveenteed.);puubliic

25、 vvoidd pllantt()llog(Appplee haas bbeenn pllantted.);/辅助方方法puubliic sstattic voiid llog(Strringg mssg)SSysttem.outt.prrinttln(msgg);puubliic iint gettTreeeAgge()rretuurn treeeAgge;puubliic vvoidd seetTrreeAAge(intt trreeAAge)tthiss.trreeAAge = ttreeeAgee;/葡葡萄类pubblicc cllasss Grrapee immpleemennts

26、Fruuitprrivaate boooleaan sseeddlesss;puubliic vvoidd grrow()llog(Grrapee iss grrowiing.);puubliic vvoidd haarveest()llog(Grrapee haas bbeenn haarveesteed.);puubliic vvoidd pllantt()llog(Grrapee haas bbeenn pllantted.);puubliic sstattic voiid llog(Strringg mssg)SSysttem.outt.prrinttln(msgg);/有无籽籽方法p

27、uubliic bboolleann geetSeeedllesss()rretuurn seeedleess;puubliic vvoidd seetSeeedlleess(boooleean seeedleess)tthiss.seeedllesss = seeedleess;/草草莓类pubblicc cllasss Sttrawwberrry impplemmentts FFruiitpuubliic vvoidd grrow()llog(Sttrawwberrry is groowinng.);puubliic vvoidd haarveest()llog(Sttrawwberrry

28、 hass beeen harrvesstedd.);puubliic vvoidd pllantt()llog(Sttrawwberrry hass beeen plaanteed.);puubliic sstattic voiid llog(Strringg mssg)SSysttem.outt.prrinttln(msgg);/农农场园丁丁类,由由他决定定创建哪哪种水果果类的实实例pubblicc cllasss FrruittGarrdenner/静态工工厂方法法puubliic sstattic Fruuit facctorry(SStriing whiich) thhrowws B

29、BadFFruiitExxcepptiooniif(wwhicch.eequaalsllgnooreCCasee(aapplle)retturnn neew AApplle();elsse iif(wwhicch.eequaalsllgnooreCCasee(ggrappe)retturnn neew GGrappe();elsse iif(wwhicch.eequaalsllgnooreCCasee(sstraawbeerryy)retturnn neew SStraawbeerryy();elssethrrow neww BaadFrruittExccepttionn(BBad fruui

30、t reqquesst);/异异常类pubblicc cllasss BaadFrruittExccepttionn exxtennds Exccepttionnpuubliic BBadFFruiitExxcepptioon(SStriing msgg)ssupeer(mmsg);/测测试类pubblicc cllasss TeestFrruittGarrdenner garrdenner =neew FFruiitGaardeenerr();trryggarddeneer.ffacttoryy(ggrappe);ggarddeneer.ffacttoryy(aapplle);ggardde

31、neer.ffacttoryy(sstraawbeerryy);ggarddeneer.ffacttoryy(bbanaana);/抛抛出异常常ccatcch(BBadFFruiitExxcepptioon ee)SSysttem.outt.prrinttln(doontt hhas thiis ffruiit.);3、三个角角色: 1、工厂类类(Crreattor)角角色:在在客户端端的直接接调用下下创建产产品对象象 2、抽象产产品角色色:可以以用一个个接口或或者一个个抽象类类实现 3、具体产产品角色色:工厂厂方法模模式所创创建的任任何对象象都是这这个角色色的实例例 4、如果工工厂方法法总是

32、循循环使用用同一个个产品对对象,那那么这个个工厂对对象可以以使用一一个属性性来存储储这个产产品对象象。 每一一次客户户端调用用工厂方方法时,工工厂方法法总是提提供这同同一个对对象。 如果果工厂方方法永远远循环使使用固定定数目的的一些产产品对象象,而且且这些产产品对象象的数目目并不大大的话, 可以以使用一一些私有有属性存存储对这这些产品品对象的的引用。比比如:一一个永远远只提供供一个产产品对象象的工厂厂对象 可以以使用一一个静态态变量存存储对这这个产品品对象的的引用。 如果果工厂方方法使用用数目不不确定,或或者数目目较大的的一些产产品对象象的话,使使用属性性变量存存储对这这些产品品对象的的引用就

33、就不方便便了, 这时时候 就就应当使使用聚集集对象存存储对产产品对象象的引用用。 5、其其他模式式; 1、单单例模式式:单例例模式要要求单例例类的构构造子是是私有的的,从而而客户端端不能直直接将之之实例化化,而必必须通过过这个静静态工厂厂方法将将之实例例化, 而而且单例例类自身身是自己己的工厂厂角色。单单例类自自己负责责创建自自身的实实例 单单例类使使用一个个静态属属性存储储自己的的唯一的的实例,工工厂方法法永远仅仅提供这这一个实实例 2、多多例模式式:它是是对单例例模式的的推广,多多例模式式也禁止止外界直直接将之之实例化化,同时时通过静静态工厂厂方法想想外界提提供循环环使用的的自身的的实例,

34、 多多例模式式可以有有多个实实例 多多例模式式具有一一个聚集集属性,通通过向这这个聚集集属性登登记已经经创建过过的实例例达到循循环使用用实例的的目的, 它它还拥有有一个内内部状态态,每一一个内部部状态都都只有一一个实例例存在 根根据外界界传入的的参量,工工厂方法法可以查查询自己己的登记记聚集,如如果具有有这个状状态的实实例已经经存在, 就就直接将将这个实实例提供供给外界界:反之之,就首首先创建建一个新新的满足足要求的的实例,将将之登记记到聚集集中,然然后再提提供客户户端。 3、备备忘录模模式:单单例模式式和多例例模式使使用一个个属性或或者聚集集属性来来登记所所创建的的产品对对象,一一边可以以通

35、过查查询这个个属性或或者聚集集属性 找到到并共享享已经创创建了的的产品对对象,这这就是备备忘录模模式的应应用。 4、MMVC模模式:是是更高层层次上的的架构模模式。 包包括:合合成模式式、策略略模式、观观察者模模式、也也有可能能会包括括装饰模模式、调调停者模模式、迭迭代子模模式以及及工厂方方法模式式等。 :如如果系统统需要有有多个控控制器参参与这个个过程的的话,简简单工厂厂模式就就不适合合了,应应当考虑虑使用工工厂方法法模式。 6、简简单工厂厂模式的的优点己己缺点 优点:模式的的核心是是工厂类类,这个个类有必必要的判判断逻辑辑,可以以决定在在什么时时候创建建哪一个个产品类类的实例例。 而客户户

36、端则可可以免除除直接创创建产品品对象的的责任,而仅仅负责“消费”产品。简单工厂模式通过这种做法实现了对责任的分割 缺点:1)这这个工厂厂类集中中了所有有的产品品创建逻逻辑,形形成一个个无所不不知的全全能类,有有人把这这种类叫叫做上帝帝类(GGod Claass)。 如如果这个个全能类类代表的的是农场场的一个个具体园园丁的话话,那么么这个园园丁就需需要对所所有的产产品负责责,成了了农场的的关键人人物, 他他什么时时候不能能正常工工作了,整整个农场场都要受受到影响响; 2)将将这么多多的逻辑辑集中放放在一个个类里面面的另外外一个缺缺点是,当当产品类类有不同同的接口口种类时时,工厂厂需要判判断在什什

37、么时候候创建某某种产品品, 这这种对时时机的判判断和对对哪一种种具体产产品的判判断逻辑辑混合在在一起,使使得系统统在将来来进行功功能扩展展时较为为困难。 这这一缺点点在工厂厂方法模模式中得得到克服服 3)由由于简单单工厂模模式使用用静态方方法作为为工厂反反尬,而而静态方方法无法法由子类类继承,因因此工厂厂角色无无法形成成基于继继承的等等级结构构。 这一缺缺点会在在工厂方方法模式式中得到到克服 7、“开闭”原则要要求一个个系统的的设计能能够允许许系统在在无需修修改的情情况下,扩扩展其功功能。 要求求系统允允许当新新的产品品加入系系统中时时,而无无需对现现有代码码进行修修改,这这一点对对于产品品消

38、费者者角色是是成立的的,而对对于工厂厂角色是是不成立立的 一般而而言:一一个系统统总是可可以划分分成为产产品的消消费者角角色(CClieent)、产产品的工工厂角色色(Faactoory)以以及产品品角色(PProdductt)三个个子系统统 对于产产品消费费者角色色来说,任任何时候候需要某某种产品品,只需需向工厂厂角色请请求即可可,而工工厂角色色在接到到请求后后, 会自行行判断创创建和提提供哪一一个产品品,所以以,产品品消费者者角色无无需知道道它得到到的是哪哪一个产产品, 产品消消费者角角色无需需修改就就可以接接纳新的的产品,而而接纳新新的产品品意味着着要修改改这个工工厂角色色的源代代码 (

39、简单单工厂角角色只在在有限的的程度上上支持“开闭”原则)工厂方法(FFacttoryy Meethood)模模式:1、工厂方方法模式式是类的的创建模模式,又又叫做虚虚拟构造造子模式式或者多多态性工工厂模式式 工厂厂方法模模式的用用意是定定义一个个创建产产品对象象的工厂厂接口,将将实际创创建工作作推迟到到子类中中。 一般而言工工厂方法法模式的的系统设设计到以以下几种种角色: 1) 抽象象工厂(CCreaatorr)角色色:担任任这个角角色的是是工厂方方法模式式的核心心,它是是与应用用程序无无关的, 任任何在模模式之中中个窗对对象的工工厂类必必须实现现这个接接口,在在实际系系统中,这这个角色色也使

40、用用抽象类类实现 2) 具体体工厂(CConccrette CCreaatorr)角色色:担任任这个角角色的是是实现了了抽象工工厂接口口的具体体javva类。 具具体工厂厂角色含含有与用用应密切切相关的的逻辑,并并且受到到应用程程序的调调用以创创建产品品对象。 3) 抽象象产品角角色:工工厂方法法模式所所创建的的对象的的超类型型,也就就是产品品对象的的共同父父类或共共同拥有有的接口口, 在在实际应应用中,这这个角色色也常常常使用抽抽象jaava类类实现 4) 具体体产品角角色:这这个角色色实现了了抽象产产品角色色所声明明的接口口。工厂厂方法模模式所创创建的每每一个对对象都是是某个具具体产品品角

41、色的的实例 Java代代码 1.2、举举例: 2. /抽象工工厂(角角色)接接口 3. puubliic iinteerfaace Creeatoor 4. /工厂厂方法 5. ppubllic Prooducct ffacttoryy(); 6. 7. 8. /抽象产产品(角角色)接接口 9. puubliic iinteerfaace Prooducct 10. 11. /一一个没有有声明任任何方法法的接口口叫做标标识接口口 12. 13. /具体体工厂(角角色)类类 14. ppubllic claass ConncreeteCCreaatorr1 iimpllemeentss Crre

42、attor 15. /工工厂方法法 16. pubblicc Prroduuct facctorry() 17. reeturrn nnew ConncreetePProdductt1(); 18. 19. 20. 21. ppubllic claass ConncreeteCCreaatorr2 iimpllemeentss Crreattor 22. /工工厂方法法 23. pubblicc Prroduuct facctorry() 24. reeturrn nnew ConncreetePProdductt2(); 25. 26. 27. 28. /具体体产品(角角色)类类 29. p

43、publlic claass ConncreetePProdductt1 iimpllemeentss Prroduuct 30. pubblicc CooncrreteeProoducct1() 31. /do sommthiing 32. 33. 34. 35. ppubllic claass ConncreetePProdductt2 iimpllemeentss Prroduuct 36. pubblicc CooncrreteeProoducct2() 37. /do sommthiing 38. 39. 40. 41. /客户户端(角角色)类类 42. ppubllic claas

44、s Cliientt 43. priivatte sstattic Creeatoor ccreaatorr1,ccreaatorr2; 44. priivatte sstattic Prooducct pprodd1,pprodd2; 45. 46. pubblicc sttatiic vvoidd maain(Strringg arrgs) 47. crreattor11 = neww CooncrreteeCreeatoor1(); 48. prrod11 = creeatoor1.facctorry(); 49. crreattor22 = neww CooncrreteeCreeat

45、oor2(); 50. prrod22 = creeatoor2.facctorry(); 51. 52. 2、举例:/抽象象工厂(角角色)接接口publlic intterffacee Crreattor/工工厂方法法pubblicc Prroduuct facctorry();/抽象象产品(角角色)接接口publlic intterffacee Prroduuct/一一个没有有声明任任何方法法的接口口叫做标标识接口口/具体体工厂(角角色)类类publlic claass ConncreeteCCreaatorr1 iimpllemeentss Crreattor/工工厂方法法pubblic

46、c Prroduuct facctorry()reeturrn nnew ConncreetePProdductt1();publlic claass ConncreeteCCreaatorr2 iimpllemeentss Crreattor/工工厂方法法pubblicc Prroduuct facctorry()reeturrn nnew ConncreetePProdductt2();/具体体产品(角角色)类类publlic claass ConncreetePProdductt1 iimpllemeentss Prroduuctpubblicc CooncrreteeProoducct

47、1()/do sommthiingpubllic claass ConncreetePProdductt2 iimpllemeentss Prroduuctpubblicc CooncrreteeProoducct2()/do sommthiing/客户户端(角角色)类类publlic claass Cliienttpriivatte sstattic Creeatoor ccreaatorr1,ccreaatorr2;priivatte sstattic Prooducct pprodd1,pprodd2;pubblicc sttatiic vvoidd maain(Strringg arr

48、gs)crreattor11 = neww CooncrreteeCreeatoor1();prrod11 = creeatoor1.facctorry();crreattor22 = neww CooncrreteeCreeatoor2();prrod22 = creeatoor2.facctorry();Cliennt对象象的活动动可以分分为两部部分 1) 客户户端创建建 CooncrreteeCreeatoor1 对象,这这时客户户端所持持有变量量的静态态类型是是Creeatoor,而而实际类类型是 ConncreeteCCreaatorr1,然然后,客客户端调调用 CConccrett

49、eCrreattor11 对象象的工厂厂方法 facctorry() ,接接着后者者调用 ConncreetePProdductt1 的的构造子子创建出出产品对对象 Java代代码 1.2、举举例: 2. /抽象象工厂角角色(水水果园丁丁) 3. ppubllic intterffacee FrruittGarrdenner 4. /工工厂方法法 5. pubblicc Frruitt faactoory(); 6. 7. 8. /具体体工厂类类(苹果果园丁) 9. ppubllic claass ApppleGGarddeneer iimpllemeentss FrruittGarrdenn

50、er 10. puubliic FFruiit ffacttoryy() 11. rretuurn neww Appplee(); 12. 13. 14. 15. /.(草草莓园丁丁) 16. pubblicc cllasss SttrawwberrryGGarddeneer iimpllemeentss FuurittGarrdenner 17. puubliic FFruiit ffacttoryy() 18. rretuurn neww Sttrawwberrry(); 19. 20. 21. 22. /.(葡葡萄园丁丁) 23. pubblicc cllasss GrrapeeGarr

51、denner impplemmentts FFuriitGaardeenerr 24. puubliic FFruiit ffacttoryy() 25. rretuurn neww Grrapee(); 26. 27. 28. 29. /抽抽象产品品角色(水水果接口口) 30. pubblicc innterrfacce FFruiit 31. vooid groow(); 32. vooid harrvesst(); 33. vooid plaant(); 34. 35. 36. /具具体产品品角色(苹苹果类) 37. pubblicc cllasss Appplee immpleemen

52、nts Fruuit 38. prrivaate intt trreeAAge; 39. 40. puubliic vvoidd grrow() 41. llog(Appplee iss grrowiing.); 42. 43. 44. puubliic vvoidd haarveest() 45. llog(Appplee haas bbeenn haarveesteed.); 46. 47. 48. puubliic vvoidd pllantt() 49. llog(Appplee haas bbeenn pllantted.); 50. 51. 52. puubliic sstatti

53、c voiid llog(Strringg mssg) 53. SSysttem.outt.prrinttln(msgg); 54. 55. 56. puubliic iint gettTreeeAgge() 57. rretuurn treeeAgge; 58. 59. 60. puubliic vvoidd seetTrreeAAge(intt trreeAAge) 61. tthiss.trreeAAge = ttreeeAgee; 62. 63. 64. /其其他同上上. 2、举例:/抽抽象工厂厂角色(水水果园丁丁)pubblicc innterrfacce FFruiitGaarde

54、enerr/工厂方方法puubliic FFruiit ffacttoryy();/具具体工厂厂类(苹苹果园丁丁)pubblicc cllasss ApppleeGarrdenner impplemmentts FFruiitGaardeenerrpuubliic FFruiit ffacttoryy()rretuurn neww Appplee();/.(草草莓园丁丁)pubblicc cllasss SttrawwberrryGGarddeneer iimpllemeentss FuurittGarrdennerpuubliic FFruiit ffacttoryy()rretuurn n

55、eww Sttrawwberrry();/.(葡葡萄园丁丁)pubblicc cllasss GrrapeeGarrdenner impplemmentts FFuriitGaardeenerrpuubliic FFruiit ffacttoryy()rretuurn neww Grrapee();/抽抽象产品品角色(水水果接口口)pubblicc innterrfacce FFruiitvooid groow();vooid harrvesst();vooid plaant();/具具体产品品角色(苹苹果类)pubblicc cllasss Appplee immpleemennts Fru

56、uitprrivaate intt trreeAAge;puubliic vvoidd grrow()llog(Appplee iss grrowiing.);puubliic vvoidd haarveest()llog(Appplee haas bbeenn haarveesteed.);puubliic vvoidd pllantt()llog(Appplee haas bbeenn pllantted.);puubliic sstattic voiid llog(Strringg mssg)SSysttem.outt.prrinttln(msgg);puubliic iint gett

57、TreeeAgge()rretuurn treeeAgge;puubliic vvoidd seetTrreeAAge(intt trreeAAge)tthiss.trreeAAge = ttreeeAgee;/其其他同上上.3、工厂方方法返还还的类型型 工厂返还的的应当是是抽象类类型,而而不是具具体类型型,只有有这样才才能保证证整队产产品的多多态性,调调用该工工厂方法法的客户户端可以以针对抽抽象编程程,依赖赖于一个个抽象产产品类型型,而不不是具体体产品类类型。 在特殊情况况下,工工厂方法法仅仅返返还一个个具体产产品类型型,这个个时候工工厂方法法模式的的功能就就退化了了,表现现为针对对产品角角

58、色的多多态性的的丧失,客客户端从从工厂方方法的静静态类型型可以知知道将要要得到的的是什么么类型的的对象,而而这违背背了工厂厂方法模模式的用用意 4、与其他他模式的的关系 1、模板方方法模式式 工厂方法模模式常常常与模板板方法模模式一起起联合使使用,其其原因有有二: 一、两个模模式都是是基于方方法的,工工厂方法法模式是是基于多多态性的的工厂方方法的,而而模板方方法模式式是基于于模板方方法和基基于方法法的 二、两个模模式的哦哦将具体体工作交交给子类类,工厂厂方法模模式将创创建工作作推延给给子类,模模板方法法模式将将生于逻逻辑交给给子类 2、MVCC模式 工厂方法模模式总是是设计到到两个等等级结构构

59、中的对对象,而而这两个个等级结结构可以以分别是是MVCC模式中中的控制制器和视视图。一一个MVVC模式式可以有有多个控控制器和和多个视视图,控控制器端端可以创创建合适适的视图图断,如如同工厂厂角色创创建合适适的对象象角色一一样,模模型端则则可以充充当这个个创建过过程的客客户端 3、亨元模模式 使用了带有有逻辑的的工厂方方法 4、备忘录录模式 亨元模式使使用了一一个聚集集来等级级所创建建的产品品对象,以以便可以以通过查查询这个个聚集找找到和共共享已经经创建了了的产品品对象,这这就是备备忘录模模式的应应用 Java代代码 1.5、举举例: 2. 问问题:某某一个商商业软件件产品需需要支持持Sybb

60、asee和Orraclle数据据库。这这个系统统需要这这样一个个查询运运行期系系统,根根据客户户需要,可可以随时时向Syybasse和OOraccle数数据库引引擎发出出查询 3. 答答案:可可以看出出,这个个系统是是由一个个客户端端Cliientt,一个个抽象工工厂角色色QueeryRRunnner,两两个具体体工厂角角色SyybasseQuueryyRunnnerr和OrraclleQuueryyRunnnerr,以及及产品角角色组成成的 4. 对对于客户户端Clliennt而言言,系统统的抽象象产品角角色是RResuultSSet接接口,而而具体产产品角色色就是jjavaa.sqql.C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论