6.創(chuàng)建型設(shè)計(jì)模式吳粉俠_第1頁
已閱讀1頁,還剩80頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第六章 創(chuàng)建型設(shè)計(jì)模式,,本章在軟件工程中所處的地位,需求分析,Design,實(shí)現(xiàn),架構(gòu),框架工作,詳細(xì)設(shè)計(jì),x,Key:,= secondary emphasis,x,= main emphasis,創(chuàng)建型設(shè)計(jì)模式,創(chuàng)建型設(shè)計(jì)的目標(biāo) 以靈活的,可修改的,能重用的方式來創(chuàng)建一個(gè)類的對象Factory設(shè)計(jì)模式 在單獨(dú)使用構(gòu)造方法不能滿足需求的情況下創(chuàng)建單獨(dú)的對象;Singleton設(shè)計(jì)

2、模式 確保只有一個(gè)類S的實(shí)例,在應(yīng)用程序中的任何地方都能夠獲得此實(shí)例;Abstract Factory設(shè)計(jì)模式 提供一個(gè)創(chuàng)建相關(guān)族或者相互依賴對象的接口,而不指明它們的具體類Prototype設(shè)計(jì)模式 創(chuàng)建一系列幾乎相同的對象,它的類型在運(yùn)行時(shí)確定,Design Purpose,在單獨(dú)使用構(gòu)造方法不能滿足需求的情況下創(chuàng)建單獨(dú)的對象,設(shè)計(jì)模式總結(jié),使用一些方法返回需要

3、的對象,Factory,工廠設(shè)計(jì)模式,名稱:工廠,using System; public interface ICar { void run(); } public class BMWCar : ICar {      pub

4、lic void run()      {  Console.WriteLine("BMWCar run");      } } public class BenzCar : IC

5、ar {      public void run()      { Console.WriteLine("BenzCar run");      } },public&

6、#160;class Driver {      public static ICar DriverCar(string carType)      {        &#

7、160; switch (carType)          {              case "BMWCar": return&

8、#160;new BMWCar();              case "BenzCar": return new BenzCar();       &#

9、160;      default: throw new Exception();         }      } } public class C

10、lient {      public static void Main()      {          ICar myCar = Dri

11、ver.DriverCar("BenzCar");          myCar.run();          Console.Read();      

12、;} },public interface IBusinessCar {   void run(); public interface ISportCar { void run(); } public class BMWBusinessCar

13、0;: IBusinessCar {    public void run()      {          Console.WriteLine("BMWCar run&q

14、uot;); }}public class BenzBusinessCar : IBusinessCar {      public void run()      { Console.WriteLine("B

15、enzBusinessCar run"); } } public class BMWSportCar:ISportCar { public void run() { Console.WriteLine("BMWSportCar run"); } }

16、 public class BenzSportCar:ISportCar { public void run() {Console.WriteLine("BenzSportCar run"); } } public interface IDriver {

17、 IBusinessCar BusinessCarDriver(); ISportCar SportCarDriver(); },public class BMWDriver:IDriver { public IBusinessCar BusinessCarDriver() { return

18、60;new BMWBusinessCar(); } public ISportCar SportCarDriver() { return new BMWSportCar(); } } public class BenzDriver:IDriver { public

19、 IBusinessCar BusinessCarDriver() { return new BenzBusinessCar(); } public ISportCar SportCarDriver() { return new BenzSportCar(); } }

20、class Client {      public static void Main()      {IDriver myDriver =new BenzDriver();    

21、0;   ISportCar myCar = myDriver.SportCarDriver();          myCar.run();          Console

22、.Read();      }}心得:抽象方法似乎達(dá)到了完美境界.把開奔馳的司機(jī)和開寶馬的司機(jī)的公共方法抽象出來,并對不同的司機(jī)創(chuàng)建不同的類,到時(shí)候不管是開什么車的司機(jī)隨你添加.它們唯一的共同點(diǎn)都是開車.,,factory method針對的是一個(gè)產(chǎn)品等級結(jié)構(gòu)  abstract factory是面向多個(gè)產(chǎn)品等級結(jié)構(gòu)的-------------

23、--------------------工廠方法模式:一個(gè)抽象產(chǎn)品類,可以派生出多個(gè)具體產(chǎn)品類。                            &#

24、160;  一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。                               每個(gè)具體工廠

25、類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例。 抽象工廠模式:多個(gè)抽象產(chǎn)品類,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類。                           

26、;    一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。                             

27、0; 每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。   區(qū)別:工廠方法模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)。      工廠方法模式的具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例,而抽象工廠模式可以創(chuàng)建多個(gè)。,Factory設(shè)計(jì)模式,Factory設(shè)計(jì)模式的目標(biāo):Factory設(shè)計(jì)模式的客戶端接口: Requiredclas

28、s instanceOfRequiredClass=MyClass.getNewInstanceOfRequiredClassFactory設(shè)計(jì)模式的的類模式: Factory模式的方法把創(chuàng)建任務(wù)委托給了構(gòu)造方法 當(dāng)需要一個(gè)基本類對象,而它的從屬子類對象直到運(yùn)行時(shí)才能確定時(shí),我們就需要考慮使用Factory模式Factory設(shè)計(jì)模式的時(shí)序圖 Factory設(shè)計(jì)模式的應(yīng)用實(shí)例

29、:E-mail的生成Factory設(shè)計(jì)模式在Java API中的應(yīng)用Factory設(shè)計(jì)模式小結(jié),Factory 類模型,Factory design pattern,MyClass createObjectOfRequiredClass( ): RequiredClass,«create object»,RequiredClass,,,Client,設(shè)計(jì)目標(biāo): ? 重用性和正確性 ?,我們希望編寫關(guān)于汽車的通

30、用代碼:這些代碼能夠用來創(chuàng)建任何種類的汽車對象。,工廠設(shè)計(jì)模式的應(yīng)用,Factory Example,,Ford福特 createAutomobile(),Toyota豐田汽車 createAutomobile(),Automobile createAutomobile(): Automobile,Client,«創(chuàng)建對象»,«創(chuàng)建對象»,,,,,,,,createObjectOfRequi

31、redClass(),Sequence Diagram for Factory工廠模式的時(shí)序圖,:MyClass,:Client,,,,RequiredClass(),,:RequiredClass,Adapted from Software Design: From Programming to Architecture by Eric J. Braude (Wiley 2003), with permission.,E-mail的

32、生成,從一個(gè)單一的控制代碼版本中,產(chǎn)生一個(gè)適合各種用戶的郵件信息要求如下:應(yīng)用程序要請求顧客的E-mail地址(沒有實(shí)現(xiàn))1.用戶鍵入顧客的E-mail地址(沒有實(shí)現(xiàn))2.應(yīng)用程序詢問需要哪類顧客的郵件信息,并將其列出3.用戶鍵入想要的顧客類型4.應(yīng)用程序向控制臺(tái)回送顧客類型5.應(yīng)用程序向控制臺(tái)打印E-mail信息,包括所有用戶想要的部分和適合所要求的類型的部分6.應(yīng)用程序發(fā)送信息,產(chǎn)生實(shí)例的典型輸出,設(shè)計(jì)目標(biāo): ?

33、正確性和重用性 ?,我們想分離代碼段,使其能夠通用于各種各樣的顧客,也想分離出為每種顧客產(chǎn)生E-mail的特殊代碼段,這樣檢查正確性和重用某部分就變得更加容易了。,,工廠設(shè)計(jì)模式應(yīng)用,Customer getMessage(),ClientsendMessage(),,Frequent getMessage(),Returning getMessage(),Curious getMessage(),Newbie getMes

34、sage(),MailMessagetext,MailGenerationApplicationgetCustomerTypeFromUser(),«setup»,工廠: 郵件生成舉例,設(shè)計(jì)模式在java API中的應(yīng)用,Factory design pattern,Component getGraphics(): Graphics,«createobject»,,Client,Graph

35、ics,單態(tài)設(shè)計(jì)模式,名字:間態(tài)設(shè)計(jì)模式,別名間例設(shè)計(jì)模式,單件設(shè)計(jì)模式問題:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)方案:效果:,Singleton: 類模型,Singleton Design Pattern,MyClass getSingletonOfMyClass(): MyClass,,Client,,1,singletonOfMyClass,«static»,Singleton設(shè)計(jì)模式,

36、Singleton設(shè)計(jì)模式的目標(biāo): 確保只有一個(gè)類S的實(shí)例,在應(yīng)用程序中的任何地方都能夠獲得些實(shí)例Singleton設(shè)計(jì)模式的客戶端接口: User user=user.getTheUser();Singleton設(shè)計(jì)模式的的類模型: S myVeryOwnInstanceOfS=new S();Singleton設(shè)計(jì)模式的應(yīng)用實(shí)例:Singleton設(shè)

37、計(jì)模式在Java API中的應(yīng)用Singleton設(shè)計(jì)模式的模式小結(jié),關(guān)鍵概念: ? 單態(tài)設(shè)計(jì)模式 ?,保證一個(gè)類公有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn),設(shè)計(jì)目標(biāo),確保只有一個(gè)類S的實(shí)例,在應(yīng)用程序中的任何地方都能夠獲得此實(shí)例,設(shè)計(jì)模式小結(jié),使S類的構(gòu)造方法私有化;定義一個(gè)類型為S的私有靜態(tài)屬性;定義一個(gè)公有的存取方法,單態(tài),設(shè)計(jì)目標(biāo): ? 正確性 ?,Singleton設(shè)計(jì)模式實(shí)現(xiàn)了只有一個(gè)User對象存在的目標(biāo),保證了應(yīng)

38、用程序不會(huì)創(chuàng)建意想不到的User實(shí)例。,Singleton模式的工作原理:,用一個(gè)特殊的方法來實(shí)例化所需的對象。其中最關(guān)鍵的就是這個(gè)特殊的方法: 調(diào)用這個(gè)方法時(shí),檢查對象是否已經(jīng)實(shí)例化。如果已經(jīng)實(shí)例化,該方法僅獲取該對象的一個(gè)引用。如果尚未實(shí)例化,該方法實(shí)例化該對象并返回該對象的一個(gè)引用。 為了確保這是實(shí)例化此類對象的惟一方法,我將這個(gè)類的構(gòu)造函數(shù)定義為保護(hù)或者私有的。 Single模式的

39、本質(zhì)在于,應(yīng)用程序中的每個(gè)對象都使用Singlton類的同一實(shí)例,Singleton的設(shè)計(jì)特點(diǎn),1.包含用自身聲明的類變量,這個(gè)類變量是它唯一的實(shí)例2.構(gòu)造方法的訪問權(quán)限是私有,這樣一來,任何其他類都無法使用Singleton類來創(chuàng)建對象。3.Singleton類負(fù)責(zé)創(chuàng)建自己唯一的實(shí)例,并提供訪問該實(shí)例的方法。,單態(tài)設(shè)計(jì)模式 – 應(yīng)用到MyClass,Define a private static member variable o

40、f MyClass of type MyClassprivate static MyClass singletonOfMyClass = new MyClass(); Make the constructor of MyClass privateprivate MyClass() { /* …. constructor code …. */ };Define a public static method to access t

41、he memberpublic static MyClass getSingletonOfMyClass() { return singletonOfMyClass;},Output for Singleton Experiment Example,設(shè)計(jì)模式在Experiment例子中的應(yīng)用,ExperimenttheExperiment: Experiment analyze()getTheExperim

42、ent(): ExperimentreportResults(),Client,,,,theExperiment,1,«static»,使用Singleton類示例:,Pubic class Moon{ private static Moon uniqueMoon; double radius;Double distanceToEarth;Private Moon(){ uniqueMoon=

43、this; radius=1738; distanceToEarth; private Moon(){ uniqueMoon=this; radius=1738; distanceToEarth=363300; },,Public static synchronized Moon getMoon(){ if(uniqueMoon=NULL=new Moon();}Return uniqu

44、eMoon;}Public String show(){ String s=“月亮的半徑是”+radius+“千米,距地球是”+distanceToEarth+”km”; return s; }},,Import javax.swing.*;Import java.awt.*;Public class Application{ public static void main(String args[]){

45、 MyFrame f1=new MyFrame(“張三看月亮”); MyFrame f2=new MyFrame(“李四看月亮”); f1.setBounds(10,10,360,150); f1.validate(); f2.setBounds(370,10,360,150); f2.validate(); }},Class MyFrame exte

46、nds JFrame{ String str; MyFrame(String title){ Moon moon=Moon.getMoon(); str=moon.show(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setVisible(true); Repaint(); } public

47、void paint(Graphics g){ super.paint(g); g.setFont(new Font(“宋體”,Font..BOLD,14)); g.drawString(str,5,100); }},關(guān)健概念: ? 單態(tài)設(shè)計(jì)模式 ?,當(dāng)一個(gè)類必須有且只有一個(gè)實(shí)例時(shí),使構(gòu)造方法私有化,并且使用公有的存取方法來實(shí)例化一個(gè)靜態(tài)的、私有的變量。,Singleton模式:關(guān)鍵特性,意圖:

48、希望對象只有一個(gè)實(shí)例,但沒有控制全局對象實(shí)例化的全局對象 。還希望確保所有實(shí)體使用該對象相同的實(shí)例,而無需將引用傳給他們。問題:幾個(gè)不同的客戶對象需要引用同一對象,而且希望確保這種類型的對象數(shù)目不超過一個(gè)。解決方案:保證一個(gè)實(shí)例參與者與協(xié)作者: Client對象只能通過getInstance方法創(chuàng)建Singleton實(shí)例。效果:Client對象無需操心是否已存在Singleton實(shí)例。這是由Singleton自己控制的。實(shí)現(xiàn)

49、: 添加一個(gè)類的私有的靜態(tài)成員變量,引用所需的對象(初值為NULL) 添加一個(gè)公共靜態(tài)方法,它在成員變量的值為NULL時(shí)實(shí)例化這個(gè)類(并設(shè)置成變量的值),然后返回該成員變量的值 將構(gòu)造函數(shù)的狀態(tài)設(shè)置為保護(hù)或私有,從而防止任何人直接實(shí)例化這個(gè)類,繞過靜態(tài)構(gòu)造函數(shù)機(jī)制。,示例代碼:使用Singleton模式,abstract public class Tax{

50、static private Tax instance;protected Tax(){ }abstract double calcTax(double qty,double price);public static Tax getInstance(){//use whatever rule you use to determine//which tax object to use.For now,//Let'

51、;s creae a USTAx object. intance =USTax.getInstance(); return instance; }}public class USTax extends Tax{private static USTax instance;private USTax(){}//Note in the following ,I had to change

52、 USTax//to Tax since I used the same "getInstance" name.public static Tax getInstance(){ if(instance==null) instance=new USTax(); return instance;}},Abstract Factory設(shè)計(jì)模式,Abstract Factory設(shè)計(jì)模式的

53、設(shè)計(jì)目標(biāo): 提供一個(gè)創(chuàng)建相關(guān)族或者相互依賴對象的接口,而不指明它們的具體類型Abstract Factory設(shè)計(jì)模式客戶端接口:Abstract Factory設(shè)計(jì)模式的類模型:Abstract Factory設(shè)計(jì)模式的時(shí)序圖:Abstract Factory設(shè)計(jì)模式的應(yīng)用實(shí)例:“字處理器”Abstract Factory設(shè)計(jì)模式在Java API中的應(yīng)用Abstract Factory設(shè)計(jì)模式小

54、結(jié),字處理器的交互1/2,---> Enter title:My Life---> Enter Heading or “-done”:Birth---> Enter text:I was born in a small mountain hut ….---> Enter Heading or “-done”:Youth,---> Enter text:I grew up playing

55、 in the woods …---> Enter Heading or “-done”: Adulthood…. ---> Enter Heading or “-done”: -done(continued),字處理器的交互1/2 :Output Options,….>> Enter the style you want displayed:big,----- Title: MY LIFE

56、 -----Section 1. --- BIRTH --- I was born in a mountain hut ….Section 2. --- YOUTH ---I grew up sturdy …Section 3. --- ADULTHOOD --- ….,….>> Enter the style you want displayed:small,My LifeBirthI was

57、 born in a mountain hut ….YouthI grew up sturdy …Adulthood,Option 2,Option 1,設(shè)計(jì)目標(biāo),提供一個(gè)創(chuàng)建相關(guān)族或者相互依賴對象的接口,而不指明它們的具體類,設(shè)計(jì)模式總結(jié),為族中每個(gè)包含族方法的類捕獲族的創(chuàng)建過程,Abstract Factory,* Gamma et al,Abstract Factory*,抽象工廠設(shè)計(jì)模式的接口,Style….,Clie

58、nt,StyleAFactory,StyleBFactory,EnsemblesetAbstractFactory()doAFunction(),AbstractFactorygetAPart1Object()getAPart2Object(),* relationships within pattern application not shown,Application of Abstract Factory,應(yīng)用在字處理器中

59、的Abstract Factory接口,,Client,SmallStyle,LargeStyle,Style,DocumentsetStyle()display(),. . . . . . .,,1,,«create»,Abstract Factory 思想,EnsemblesetAbstractFactory()doAFunction(),,,AbstractFactorygetAPart1Object

60、()getAPart2Object(),StyleAFactorygetAPart1Object()getAPart2Object(),Part1,Part2,Part1StyleA,Part2StyleA,,,abstractFactory,1,,Client,Part1 getAPart1Object(){ return new Part1StyleA(); },,«create»,Abstract

61、Factory,Style….,,,AbstractFactorygetAPart1Object()getAPart2Object(),StyleAFactory,StyleBFactory,Part1,Part2,Part1StyleA,Part1StyleB,Part2StyleA,Part2StyleB,,,abstractFactory,1,,EnsembledoAFunction(),Client,1..n,1..n,P

62、art…,},,},,,,Abstract Factory時(shí)序圖,,,StyleXFactory(),:Client,,abstractFactory:StyleXFactory,,:Ensemble,,setAbstractFactory (abstractFactory ),,,getAPart_i(),,,,,Part_iStyleX(),,Selecting a style,Creating a Part_i object

63、in required style,getAPart_i(),abstractFactory:AbstractFactory,:Part_iStyleX,doAFunction(),,,Virtual function property,Assume that this method requires a Part_i object.,Design Goals At Work: ? Correctness and Reusabili

64、ty ?,我們希望分離出每一段這樣的代碼,這段代碼能以某種風(fēng)格來格式化文檔,同時(shí)也想分離出公共文檔產(chǎn)生代碼,,Abstract Factory 應(yīng)用到字處理器,DocumentgetAHeading()getATitle()grtDocumentFromUser(),,,«create»,SmallStylegetAHeading()getATitle(),LargeStylegetAHeading()

65、getATitle(),Titlevalue,Headingvalue,LargeHeadingdisplay(),,SmallHeadingdisplay(),LargeTitledisplay(),,SmallTitledisplay(),Textvalue,1,0..n,0..n,StylegetAHeading()getATitle(),,Displayable,Displayabledisplay(),,C

66、lientgetStyleFromUser()displayDocument(),style,,“Word Processor” Interaction,An Abstract Factory Application: Java ToolKit,ToolKitcreateButton()createImage(),,ConcreteToolkit1 createButton()createImage(),ConcreteTo

67、olkit2createButton()createImage(),ButtonPeer,ConcreteToolkit3createButton()createImage(),ButtonPeer implementation 3,,ImagePeer implementation 3,ImagePeer,,,Abstract Factory: 狹義接口,Style….,,,AbstractFactorygetAPart1O

68、bject()getAPart2Object(),StyleAFactory,StyleBFactory,abstractFactory,1,EnsemblesetStyleA() setStyleB()…,Client,. . . .,關(guān)鍵概念: ? 抽象工廠設(shè)計(jì)模式 ?,設(shè)計(jì)一個(gè)應(yīng)用程序,在這個(gè)應(yīng)用程序中,有幾種可能的對象集合風(fēng)格,使用協(xié)同的工廠方法捕獲這些風(fēng)格。,Abstract Factory模式:關(guān)鍵特性,意圖:需

69、要為特定的客戶(或情況)提供對象組問題:需要實(shí)例化一組相關(guān)的對象。解決方案:協(xié)調(diào)對象組的創(chuàng)建。提供一種方式,將如何執(zhí)行對象實(shí)例化的規(guī)則從使用這些對象的客戶對象提取出來。參與者與協(xié)作者:AbstractFactory為如何創(chuàng)建對象組的每個(gè)成員定義接口。一般每個(gè)組都由獨(dú)立的concreteFactory進(jìn)行創(chuàng)建。效果:這個(gè)模式將“使用哪些對象的規(guī)則與”如何使用這些對象的邏輯分離開來。實(shí)現(xiàn):定義一個(gè)抽象類來指定創(chuàng)建哪些對象。然后為每

70、個(gè)組實(shí)現(xiàn)一個(gè)具體類。可以用表或文件完成同樣的任務(wù)。,示例,任務(wù):設(shè)計(jì)一個(gè)計(jì)算機(jī)系統(tǒng),顯示并打印取自數(shù)據(jù)庫的幾何形狀。用來顯示和打印形狀的分辨率類型取決于當(dāng)前運(yùn)行系統(tǒng)的計(jì)算機(jī):CPU的速度和可用內(nèi)存。系統(tǒng)必須留意自己對計(jì)算機(jī)的要求。難點(diǎn):系統(tǒng)必須控制使用哪些驅(qū)動(dòng)程序:低配置機(jī)器使用低分辨率驅(qū)動(dòng)程序,高配置機(jī)器使用高分辨率驅(qū)動(dòng)程序。要求: 低分辨率組———LRDD和LRPD,這些驅(qū)動(dòng)程序?qū)ο到y(tǒng)提出的要求較低

71、 高分辨率組———HRDD和HRPD,這些驅(qū)動(dòng)程序?qū)ο到y(tǒng)提出的要求較低,方案一:使用switch,class Apcontrol{...public void doDraw(){... switch(RESOLUTION) { case LOW://use lrdd case HIGH://use hrdd

72、 }}public void doPrint(){switch(RESOLUTION) { case LOW://use lrpd case HIGH://use hrpd } }},方案二:使用繼承,Class ApControl{ … public void do

73、Draw(){ … myDisplayDriver.draw(); } public void doPrint(){ … myPrintDriver.print(); }},方案三:使用抽象工廠,Abstract class ResFactory{ abstract public DisplayDriver getdispDr

74、vr(); abstract public PrintDriver getPrtDrvr();}Class LowResFact extends ResFactory{ public DisplayDriver getDispDrvr(){ return new LRDD(); }}Class HighResFact extends ResFactory{ public DisplayDriver g

75、etDispDrvr(){ return new HRDD(); } public PrintDriver getPrtDrvr(){ return new HRPD(); }},Abstract Factory模式的3個(gè)關(guān)鍵的概念步驟,Prototype設(shè)計(jì)模式,Prototype設(shè)計(jì)模式的目標(biāo):創(chuàng)建一系列幾乎相同的對象,它的類型在運(yùn)行時(shí)確定設(shè)計(jì)模式:假定那個(gè)原型實(shí)例是已知的,當(dāng)需要一個(gè)新

76、實(shí)例時(shí)克隆這個(gè)原型Prototype設(shè)計(jì)模式的客戶端接口:Prototype設(shè)計(jì)模式的類模型:Prototype設(shè)計(jì)模式的時(shí)序圖:Prototype設(shè)計(jì)模式的應(yīng)用實(shí)例:顧客信息的錄入Prototype設(shè)計(jì)模式和java APIPrototype設(shè)計(jì)模式小結(jié),應(yīng)用,問題假定一個(gè)這樣的應(yīng)用程序,能夠展示辦公設(shè)備,給顧客一個(gè)所選設(shè)備的大概廓。這個(gè)應(yīng)用程序要遵循這樣一個(gè)規(guī)則 :所有桌子的裝飾風(fēng)格、顏色都是相同的,所有的椅子具有同樣

77、的風(fēng)格、同樣的花紋,等等設(shè)計(jì)目標(biāo):展示辦公室的代碼只需要編寫一次,桌子、椅子等設(shè)計(jì)部分在整個(gè)設(shè)計(jì)中以獨(dú)立的、可維護(hù)的方式出現(xiàn),原型設(shè)計(jì)舉例:選擇,,,,,,,,,,,Click on choice of storage:,Click on choice of chair:,Click on choice of desk:,Furniture color,Furniture hardware type,colonial,,,,,一個(gè)簡

78、單的原型設(shè)計(jì)模式舉例,設(shè)計(jì)目標(biāo),創(chuàng)建一系列幾乎相同的對象,它的類型在運(yùn)行時(shí)確定,設(shè)計(jì)模式,假定那個(gè)原型實(shí)例是已知的,當(dāng)需要一個(gè)新實(shí)例時(shí)克隆這個(gè)原型,Prototype,,具有客戶的原型接口,EnsemblecreateEnsemble(),Client,Part1clone(),Part2clone(),(optional part of interface),客戶通過引用命名為Ensemble的聚合對象來使用Prototype設(shè)

79、計(jì)模式客戶訪問Prototype應(yīng)用的方法: CreateEnsemble() CreateEnsemble(Element1 aPrototypeElement1, Element2 aPrototypeElement2…);,Prototype Design Pattern,The Prototype 設(shè)計(jì)模式的思想,Ensemblec

80、reateEnsemble(),,Client,MyPartclone(): MyPart,MyPartStyleAclone(),MyPartStyleBclone(),,myPartPrototype,1,,// To create a MyPart instance:MyPart p = myPartPrototype.clone();,,Prototype Class Model類模型,EnsemblecreateEn

81、semble(),,Client,Part1clone(),Part2clone(),Part1StyleAclone(),Part1StyleBclone(),Part2StyleAclone(),Part2StyleBclone(),,,part1Prototype,part2Prototype,1,1,,.....// To create a Part1 object:Part1 p1 = part1Prototy

82、pe.clone();….,,Part1StyleB returnObject = new Part1StyleB();….,Part1StyleCclone(),,時(shí)序圖,,,,,partNPrototype:PartN,,:Ensemble,createEnsemble(),clone(),,,,,,,partNPrototype:PartNStyleB,,,,:PartNStyleB,PartNStyleB(),,(vi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論