2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

3、的對象,Factory,工廠設計模式,名稱:工廠,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();      }}心得:抽象方法似乎達到了完美境界.把開奔馳的司機和開寶馬的司機的公共方法抽象出來,并對不同的司機創(chuàng)建不同的類,到時候不管是開什么車的司機隨你添加.它們唯一的共同點都是開車.,,factory method針對的是一個產(chǎn)品等級結(jié)構(gòu)  abstract factory是面向多個產(chǎn)品等級結(jié)構(gòu)的-------------

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

39、本質(zhì)在于,應用程序中的每個對象都使用Singlton類的同一實例,Singleton的設計特點,1.包含用自身聲明的類變量,這個類變量是它唯一的實例2.構(gòu)造方法的訪問權(quán)限是私有,這樣一來,任何其他類都無法使用Singleton類來創(chuàng)建對象。3.Singleton類負責創(chuàng)建自己唯一的實例,并提供訪問該實例的方法。,單態(tài)設計模式 – 應用到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,設計模式在Experiment例子中的應用,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)設計模式 ?,當一個類必須有且只有一個實例時,使構(gòu)造方法私有化,并且使用公有的存取方法來實例化一個靜態(tài)的、私有的變量。,Singleton模式:關(guān)鍵特性,意圖:

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

49、: 添加一個類的私有的靜態(tài)成員變量,引用所需的對象(初值為NULL) 添加一個公共靜態(tài)方法,它在成員變量的值為NULL時實例化這個類(并設置成變量的值),然后返回該成員變量的值 將構(gòu)造函數(shù)的狀態(tài)設置為保護或私有,從而防止任何人直接實例化這個類,繞過靜態(tài)構(gòu)造函數(shù)機制。,示例代碼:使用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設計模式,Abstract Factory設計模式的

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

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,設計目標,提供一個創(chuàng)建相關(guān)族或者相互依賴對象的接口,而不指明它們的具體類,設計模式總結(jié),為族中每個包含族方法的類捕獲族的創(chuàng)建過程,Abstract Factory,* Gamma et al,Abstract Factory*,抽象工廠設計模式的接口,Style….,Clie

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

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時序圖,,,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 ?,我們希望分離出每一段這樣的代碼,這段代碼能以某種風格來格式化文檔,同時也想分離出公共文檔產(chǎn)生代碼,,Abstract Factory 應用到字處理器,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)鍵概念: ? 抽象工廠設計模式 ?,設計一個應用程序,在這個應用程序中,有幾種可能的對象集合風格,使用協(xié)同的工廠方法捕獲這些風格。,Abstract Factory模式:關(guān)鍵特性,意圖:需

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

70、個組實現(xiàn)一個具體類??梢杂帽砘蛭募瓿赏瑯拥娜蝿?。,示例,任務:設計一個計算機系統(tǒng),顯示并打印取自數(shù)據(jù)庫的幾何形狀。用來顯示和打印形狀的分辨率類型取決于當前運行系統(tǒng)的計算機:CPU的速度和可用內(nèi)存。系統(tǒng)必須留意自己對計算機的要求。難點:系統(tǒng)必須控制使用哪些驅(qū)動程序:低配置機器使用低分辨率驅(qū)動程序,高配置機器使用高分辨率驅(qū)動程序。要求: 低分辨率組———LRDD和LRPD,這些驅(qū)動程序?qū)ο到y(tǒng)提出的要求較低

71、 高分辨率組———HRDD和HRPD,這些驅(qū)動程序?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個關(guān)鍵的概念步驟,Prototype設計模式,Prototype設計模式的目標:創(chuàng)建一系列幾乎相同的對象,它的類型在運行時確定設計模式:假定那個原型實例是已知的,當需要一個新

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

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

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

79、計模式客戶訪問Prototype應用的方法: CreateEnsemble() CreateEnsemble(Element1 aPrototypeElement1, Element2 aPrototypeElement2…);,Prototype Design Pattern,The Prototype 設計模式的思想,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(),,時序圖,,,,,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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論