版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
DesignPatterns設(shè)計(jì)模式概述劉偉(Sunny)大綱引言設(shè)計(jì)模式的誕生與發(fā)展設(shè)計(jì)模式的定義與分類GoF設(shè)計(jì)模式簡(jiǎn)介設(shè)計(jì)模式的優(yōu)點(diǎn)引言從三個(gè)實(shí)例說(shuō)起……
實(shí)例一:龐大的跨平臺(tái)圖像瀏覽系統(tǒng)實(shí)例二:不夠靈活的影院售票系統(tǒng)實(shí)例三:重用第三方算法庫(kù)時(shí)面臨的問(wèn)題引言龐大的跨平臺(tái)圖像瀏覽系統(tǒng)實(shí)例說(shuō)明某軟件公司要開發(fā)一個(gè)跨平臺(tái)圖像瀏覽系統(tǒng),要求該系統(tǒng)能夠顯示BMP、JPG、GIF、PNG等多種格式的文件,并且能夠在Windows、Linux、Unix等多個(gè)操作系統(tǒng)上運(yùn)行。系統(tǒng)首先將各種格式的文件解析為像素矩陣(Matrix),然后將像素矩陣顯示在屏幕上,在不同的操作系統(tǒng)中可以調(diào)用不同的繪制函數(shù)來(lái)繪制像素矩陣。引言龐大的跨平臺(tái)圖像瀏覽系統(tǒng)初始設(shè)計(jì)方案引言龐大的跨平臺(tái)圖像瀏覽系統(tǒng)問(wèn)題(1)采用了多層繼承結(jié)構(gòu),導(dǎo)致系統(tǒng)中類的個(gè)數(shù)急劇增加,具體層的類的個(gè)數(shù)
=所支持的圖像文件格式數(shù)×所支持的操作系統(tǒng)數(shù)(2)系統(tǒng)擴(kuò)展麻煩,無(wú)論是增加新的圖像文件格式還是增加新的操作系統(tǒng),都需要增加大量的具體類,這將導(dǎo)致系統(tǒng)變得非常龐大,增加運(yùn)行和維護(hù)開銷引言不夠靈活的影院售票系統(tǒng)實(shí)例說(shuō)明某軟件公司為某電影院開發(fā)了一套影院售票系統(tǒng),在該系統(tǒng)中需要為不同類型的用戶提供不同的電影票打折方式,具體打折方案如下:(1)學(xué)生憑學(xué)生證可享受票價(jià)8折優(yōu)惠;(2)年齡在10周歲及以下的兒童可享受每張票減免10元的優(yōu)惠(原始票價(jià)需大于等于20元);(3)影院VIP用戶除享受票價(jià)半價(jià)優(yōu)惠外還可進(jìn)行積分,積分累計(jì)到一定額度可換取電影院贈(zèng)送的獎(jiǎng)品。該系統(tǒng)在將來(lái)可能還要根據(jù)需要引入新的打折方式。引言不夠靈活的影院售票系統(tǒng)初始實(shí)現(xiàn)方案//電影票類classMovieTicket{privatedoubleprice;//電影票價(jià)格privatestringtype;//電影票類型
……//計(jì)算打折之后的票價(jià)
publicdoubleCalculate(){//學(xué)生票折后票價(jià)計(jì)算
if(this.type.Equals("student")){Console.WriteLine("學(xué)生票:");returnthis.price*0.8;}//兒童票折后票價(jià)計(jì)算
elseif(this.type.Equals("children")&&this.price>=20){Console.WriteLine("兒童票:");returnthis.price-10;}//VIP票折后票價(jià)計(jì)算
elseif(this.type.Equals("vip")){Console.WriteLine("VIP票:");Console.WriteLine("增加積分!");returnthis.price*0.5;}else{returnthis.price;//如果不滿足任何打折要求,則返回原始票價(jià)
}}}引言不夠靈活的影院售票系統(tǒng)問(wèn)題(1)MovieTicket類的Calculate()方法非常龐大,它包含各種打折算法的實(shí)現(xiàn)代碼,在代碼中出現(xiàn)了較長(zhǎng)的條件轉(zhuǎn)移語(yǔ)句,不利于測(cè)試和維護(hù)(2)在增加新的打折算法或者對(duì)原有打折算法進(jìn)行修改時(shí)必須修改MovieTicket類的源代碼,系統(tǒng)的靈活性和可擴(kuò)展性較差(3)算法的復(fù)用性差,如果另一個(gè)系統(tǒng)需要重用某些打折算法,只能通過(guò)對(duì)源代碼進(jìn)行復(fù)制粘貼來(lái)重用,無(wú)法單獨(dú)重用其中的某個(gè)或某些算法引言重用第三方算法庫(kù)時(shí)面臨的問(wèn)題實(shí)例說(shuō)明某軟件公司在開發(fā)一個(gè)銀行業(yè)務(wù)處理系統(tǒng)時(shí)需要對(duì)其中的機(jī)密數(shù)據(jù)進(jìn)行加密處理,通過(guò)分析發(fā)現(xiàn),用于加密的程序已經(jīng)存在于一個(gè)第三方算法庫(kù)中,但是沒(méi)有該算法庫(kù)的源代碼。在系統(tǒng)初始設(shè)計(jì)階段,已定義數(shù)據(jù)操作接口DataOperation,且該接口已被很多同事使用,對(duì)該接口的修改勢(shì)必導(dǎo)致大量代碼需要產(chǎn)生改動(dòng)。引言重用第三方算法庫(kù)時(shí)面臨的問(wèn)題問(wèn)題如何在既不修改現(xiàn)有接口又不需要算法庫(kù)源代碼的基礎(chǔ)上能夠?qū)崿F(xiàn)第三方算法庫(kù)的重用是該軟件公司開發(fā)人員必須面對(duì)的問(wèn)題。引言如何解決?引言歡迎進(jìn)入模式世界!引言本講義配套教材設(shè)計(jì)模式的誕生與發(fā)展模式的誕生與定義模式(Pattern)起源于建筑業(yè)而非軟件業(yè)模式之父——美國(guó)加利佛尼亞大學(xué)環(huán)境結(jié)構(gòu)中心研究所所長(zhǎng)ChristopherAlexander博士《APatternLanguage:Towns,Buildings,Construction》——253個(gè)建筑和城市規(guī)劃模式模式Context(模式可適用的前提條件)Theme或Problem(在特定條件下要解決的目標(biāo)問(wèn)題)Solution(對(duì)目標(biāo)問(wèn)題求解過(guò)程中各種物理關(guān)系的記述)設(shè)計(jì)模式的誕生與發(fā)展ChristopherAlexander設(shè)計(jì)模式的誕生與發(fā)展模式的誕生與定義Alexander給出了關(guān)于模式的經(jīng)典定義:每個(gè)模式都描述了一個(gè)在我們的環(huán)境中不斷出現(xiàn)的問(wèn)題,然后描述了該問(wèn)題的解決方案的核心,通過(guò)這種方式,人們可以無(wú)數(shù)次地重用那些已有的解決方案,無(wú)須再重復(fù)相同的工作模式是在特定環(huán)境下人們解決某類重復(fù)出現(xiàn)問(wèn)題的一套成功或有效的解決方案。
Apatternisasuccessfulorefficientsolutiontoarecurringproblemwithinacontext.設(shè)計(jì)模式的誕生與發(fā)展軟件模式概述20世紀(jì)80年代末,軟件工程界開始關(guān)注ChristopherAlexander等在這一住宅、公共建筑與城市規(guī)劃領(lǐng)域的重大突破“四人組(GangofFour,GoF,分別是ErichGamma,RichardHelm,RalphJohnson和JohnVlissides)”于1994年歸納發(fā)表了23種在軟件開發(fā)中使用頻率較高的設(shè)計(jì)模式,旨在用模式來(lái)統(tǒng)一溝通面向?qū)ο蠓椒ㄔ诜治觥⒃O(shè)計(jì)和實(shí)現(xiàn)間的鴻溝設(shè)計(jì)模式的誕生與發(fā)展GangofFour(GoF)設(shè)計(jì)模式的誕生與發(fā)展ErichGamma蘇黎世大學(xué)計(jì)算機(jī)科學(xué)博士,是Eclipse、JUnit等項(xiàng)目的負(fù)責(zé)人JohnVlissides斯坦福大學(xué)計(jì)算機(jī)科學(xué)博士,原IBM研究員,于2005年11月24日因腦瘤去世,享年44歲RalphJohnson
墨爾本大學(xué)計(jì)算機(jī)科學(xué)博士,原IBM研究員,現(xiàn)供職于波士頓顧問(wèn)集團(tuán)RichardHelm康奈爾大學(xué)計(jì)算機(jī)科學(xué)博士,伊利諾伊大學(xué)教授GangofFour設(shè)計(jì)模式的誕生與發(fā)展軟件模式概述軟件模式:在一定條件下的軟件開發(fā)問(wèn)題及其解法問(wèn)題描述前提條件(環(huán)境或約束條件)解法效果設(shè)計(jì)模式的誕生與發(fā)展軟件模式概述設(shè)計(jì)模式的誕生與發(fā)展軟件模式概述大三律(RuleofThree)只有經(jīng)過(guò)3個(gè)以上不同類型(或不同領(lǐng)域)的系統(tǒng)的校驗(yàn),一個(gè)解決方案才能從候選模式升格為模式設(shè)計(jì)模式的誕生與發(fā)展設(shè)計(jì)模式的發(fā)展1987年,KentBeck和WardCunningham借鑒Alexander的模式思想在程序開發(fā)中開始應(yīng)用一些模式,在OOPSLA會(huì)議上發(fā)表了他們的成果1990年,OOPSLA與ECOOP聯(lián)合舉辦,ErichGamma和RichardHelm等人開始討論有關(guān)模式的話題(BruceAnderson主持),“四人組”正式成立,并開始著手進(jìn)行設(shè)計(jì)模式的分類整理工作1991年,OOPSLA,BruceAnderson主持了首次針對(duì)設(shè)計(jì)模式的研討會(huì)1992年,OOPSLA,Anderson再度主持研討會(huì),模式已經(jīng)逐漸成為人們討論的話題注:OOPSLA(Object-OrientedProgramming,Systems,Languages&Applications,面向?qū)ο缶幊?、系統(tǒng)、語(yǔ)言和應(yīng)用大會(huì)),編程語(yǔ)言及軟件工程國(guó)際頂級(jí)會(huì)議,2010年改為SPLASH---Systems,Programming,LanguagesandApplications:SoftwareforHumanity設(shè)計(jì)模式的誕生與發(fā)展設(shè)計(jì)模式的發(fā)展1993年,KentBeck和GradyBooch贊助了第一次關(guān)于設(shè)計(jì)模式的會(huì)議,這個(gè)設(shè)計(jì)模式研究組織發(fā)展成為著名的HillsideGroup研究組1994年,由HillsideGroup發(fā)起,在美國(guó)伊利諾伊州(Illinois)的AllertonPark召開了第1屆關(guān)于面向?qū)ο竽J降氖澜缧詴?huì)議,名為PLoP(PatternLanguagesofPrograms,編程語(yǔ)言模式會(huì)議),簡(jiǎn)稱PLoP‘941995年,PLoP‘95仍在伊利諾伊州的AllertonPark舉行,“四人組”出版了《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》(DesignPatterns:ElementsofReusableObject-OrientedSoftware)一書,本書成為1995年最搶手的面向?qū)ο髸?,也成為設(shè)計(jì)模式的經(jīng)典書籍設(shè)計(jì)模式的誕生與發(fā)展設(shè)計(jì)模式的發(fā)展從1995年至今,設(shè)計(jì)模式在軟件開發(fā)中得以廣泛應(yīng)用,在Sun的JavaSE/JavaEE平臺(tái)和Microsoft的.NET平臺(tái)設(shè)計(jì)中應(yīng)用了大量的設(shè)計(jì)模式輕量級(jí)框架:Struts、Spring、Hibernate、JUnit、NHibernate、NUnit……語(yǔ)言:C++、Java、C#、Objective-C、
VB.net、Smalltalk、PHP、
Delphi、JavaScript、Ruby……得到越來(lái)越多的企業(yè)和高校的關(guān)注與重視越來(lái)越多的書籍和網(wǎng)站設(shè)計(jì)模式的定義與分類設(shè)計(jì)模式的定義設(shè)計(jì)模式(DesignPattern)一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)是一種用于對(duì)軟件系統(tǒng)中不斷重現(xiàn)的設(shè)計(jì)問(wèn)題的解決方案進(jìn)行文檔化的技術(shù)是一種共享專家設(shè)計(jì)經(jīng)驗(yàn)的技術(shù)目的:為了可重用代碼、讓代碼更容易被他人理解、提高代碼的可靠性設(shè)計(jì)模式的定義與分類設(shè)計(jì)模式的定義設(shè)計(jì)模式是在特定環(huán)境下為解決某一通用軟件設(shè)計(jì)問(wèn)題提供的一套定制的解決方案,該方案描述了對(duì)象和類之間的相互作用。Designpatternsaredescriptionsofcommunicatingobjectsandclassesthatarecustomizedtosolveageneraldesign
probleminaparticularcontext.設(shè)計(jì)模式的定義與分類設(shè)計(jì)模式的基本要素設(shè)計(jì)模式一般包含模式名稱、問(wèn)題、目的、解決方案、效果、實(shí)例代碼和相關(guān)設(shè)計(jì)模式等基本要素,4個(gè)關(guān)鍵要素如下:模式名稱(PatternName)問(wèn)題(Problem)解決方案(Solution)效果(Consequences)設(shè)計(jì)模式的定義與分類設(shè)計(jì)模式的分類根據(jù)目的(模式是用來(lái)做什么的)可分為創(chuàng)建型(Creational),結(jié)構(gòu)型(Structural)和行為型(Behavioral)三類:創(chuàng)建型模式主要用于創(chuàng)建對(duì)象結(jié)構(gòu)型模式主要用于處理類或?qū)ο蟮慕M合行為型模式主要用于描述類或?qū)ο笕绾谓换ズ驮鯓臃峙渎氊?zé)設(shè)計(jì)模式的定義與分類設(shè)計(jì)模式的分類根據(jù)范圍,即模式主要是處理類之間的關(guān)系還是處理對(duì)象之間的關(guān)系,可分為類模式和對(duì)象模式兩種:類模式處理類和子類之間的關(guān)系,這些關(guān)系通過(guò)繼承建立,在編譯時(shí)刻就被確定下來(lái),是一種靜態(tài)關(guān)系對(duì)象模式處理對(duì)象間的關(guān)系,這些關(guān)系在運(yùn)行時(shí)變化,更具動(dòng)態(tài)性GoF設(shè)計(jì)模式簡(jiǎn)介范圍\目的創(chuàng)建型模式結(jié)構(gòu)型模式行為型模式類模式工廠方法模式(類)適配器模式解釋器模式模板方法模式對(duì)象模式抽象工廠模式建造者模式原型模式單例模式(對(duì)象)適配器模式橋接模式組合模式裝飾模式外觀模式享元模式代理模式職責(zé)鏈模式命令模式迭代器模式中介者模式備忘錄模式觀察者模式狀態(tài)模式策略模式訪問(wèn)者模式GoF設(shè)計(jì)模式簡(jiǎn)介創(chuàng)建型模式抽象工廠模式(AbstractFactory)
★★★★★建造者模式(Builder)
★★☆☆☆工廠方法模式(FactoryMethod)★★★★★原型模式(Prototype)
★★★☆☆單例模式(Singleton)★★★★☆
GoF設(shè)計(jì)模式簡(jiǎn)介結(jié)構(gòu)型模式適配器模式(Adapter)
★★★★☆橋接模式(Bridge)
★★★☆☆組合模式(Composite)
★★★★☆裝飾模式(Decorator)
★★★☆☆外觀模式(Facade)
★★★★★享元模式(Flyweight)
★☆☆☆☆代理模式(Proxy)
★★★★☆GoF設(shè)計(jì)模式簡(jiǎn)介行為型模式職責(zé)鏈模式(ChainofResponsibility)
★★☆☆☆命令模式(Command)
★★★★☆解釋器模式(Interpreter)
★☆☆☆☆迭代器模式(Iterator)
★★★★★中介者模式(Mediator)
★★☆☆☆備忘錄模式(Memento)
★★☆☆☆觀察者模式(Observer)
★★★★★狀態(tài)模式(State)
★★★☆☆策略模式(Strategy)
★★★★☆模板方法模式(TemplateMethod)
★★★☆☆訪問(wèn)者模式(Visitor)
★☆☆☆☆設(shè)計(jì)模式的優(yōu)點(diǎn)融合了眾多專家的經(jīng)驗(yàn),并以一種標(biāo)準(zhǔn)的形式供廣大開發(fā)人員所用提供了一套通用的設(shè)計(jì)詞匯和一種通用的語(yǔ)言,以方便開發(fā)人員之間進(jìn)行溝通和交流,使得設(shè)計(jì)方案更加通俗易懂讓人們可以更加簡(jiǎn)單方便地復(fù)用成功的設(shè)計(jì)和體系結(jié)構(gòu)使得設(shè)計(jì)方案更加靈活,且易于修改將提高軟件系統(tǒng)的開發(fā)效率和軟件質(zhì)量,且在一定程度上節(jié)約設(shè)計(jì)成本有助于初學(xué)者更深入地理解面向?qū)ο笏枷?,方便閱讀和學(xué)習(xí)現(xiàn)有類庫(kù)與其他系統(tǒng)中的源代碼,還可以提高軟件的設(shè)計(jì)水平和代碼質(zhì)量ENDThanks!Thanks!DesignPatterns面向?qū)ο笤O(shè)計(jì)原則劉偉(Sunny)weiliu_china@126.com大綱面向?qū)ο笤O(shè)計(jì)原則概述單一職責(zé)原則開閉原則里氏代換原則依賴倒轉(zhuǎn)原則接口隔離原則合成復(fù)用原則迪米特法則面向?qū)ο笤O(shè)計(jì)原則概述可維護(hù)性(Maintainability):指軟件能夠被理解、改正、適應(yīng)及擴(kuò)展的難易程度可復(fù)用性(Reusability):指軟件能夠被重復(fù)使用的難易程度面向?qū)ο笤O(shè)計(jì)的目標(biāo)之一在于支持可維護(hù)性復(fù)用,一方面需要實(shí)現(xiàn)設(shè)計(jì)方案或者源代碼的復(fù)用,另一方面要確保系統(tǒng)能夠易于擴(kuò)展和修改,具有良好的可維護(hù)性面向?qū)ο笤O(shè)計(jì)原則概述面向?qū)ο笤O(shè)計(jì)原則為支持可維護(hù)性復(fù)用而誕生指導(dǎo)性原則,非強(qiáng)制性原則每一個(gè)設(shè)計(jì)模式都符合一個(gè)或多個(gè)面向?qū)ο笤O(shè)計(jì)原則,面向?qū)ο笤O(shè)計(jì)原則是用于評(píng)價(jià)一個(gè)設(shè)計(jì)模式的使用效果的重要指標(biāo)之一面向?qū)ο笤O(shè)計(jì)原則概述設(shè)計(jì)原則名稱定義使用頻率單一職責(zé)原則(SingleResponsibilityPrinciple,SRP)一個(gè)對(duì)象應(yīng)該只包含單一的職責(zé),并且該職責(zé)被完整地封裝在一個(gè)類中★★★★☆開閉原則(Open-ClosedPrinciple,OCP)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉★★★★★里氏代換原則(LiskovSubstitutionPrinciple,LSP)所有引用基類的地方必須能透明地使用其子類的對(duì)象★★★★★依賴倒轉(zhuǎn)原則(DependenceInversionPrinciple,DIP)高層模塊不應(yīng)該依賴低層模塊,它們都應(yīng)該依賴抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象★★★★★接口隔離原則(InterfaceSegregationPrinciple,ISP)客戶端不應(yīng)該依賴那些它不需要的接口★★☆☆☆合成復(fù)用原則(CompositeReusePrinciple,CRP)優(yōu)先使用對(duì)象組合,而不是繼承來(lái)達(dá)到復(fù)用的目的★★★★☆迪米特法則(LawofDemeter,LoD)每一個(gè)軟件單位對(duì)其他的單位都只有最少的知識(shí),而且局限于那些與本單位密切相關(guān)的軟件單位★★★☆☆單一職責(zé)原則單一職責(zé)原則定義單一職責(zé)原則是最簡(jiǎn)單的面向?qū)ο笤O(shè)計(jì)原則,用于控制類的粒度大小單一職責(zé)原則:一個(gè)對(duì)象應(yīng)該只包含單一的職責(zé),并且該職責(zé)被完整地封裝在一個(gè)類中。SingleResponsibilityPrinciple(SRP):Everyobjectshouldhaveasingleresponsibility,andthatresponsibilityshouldbeentirelyencapsulatedbytheclass.單一職責(zé)原則單一職責(zé)原則定義就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因Thereshouldneverbemorethanonereasonforaclasstochange.單一職責(zé)原則單一職責(zé)原則分析一個(gè)類(大到模塊,小到方法)承擔(dān)的職責(zé)越多,它被復(fù)用的可能性就越小當(dāng)一個(gè)職責(zé)變化時(shí),可能會(huì)影響其他職責(zé)的運(yùn)作將這些職責(zé)進(jìn)行分離,將不同的職責(zé)封裝在不同的類中將不同的變化原因封裝在不同的類中單一職責(zé)原則是實(shí)現(xiàn)高內(nèi)聚、低耦合的指導(dǎo)方針單一職責(zé)原則單一職責(zé)原則實(shí)例實(shí)例說(shuō)明某軟件公司開發(fā)人員針對(duì)CRM(CustomerRelationshipManagement,客戶關(guān)系管理)系統(tǒng)中的客戶信息圖表統(tǒng)計(jì)模塊提出了如圖2-1所示的初始設(shè)計(jì)方案。圖2-1初始設(shè)計(jì)方案結(jié)構(gòu)圖在圖2-1中,GetConnection()方法用于連接數(shù)據(jù)庫(kù),F(xiàn)indCustomers()用于查詢所有的客戶信息,CreateChart()用于創(chuàng)建圖表,DisplayChart()用于顯示圖表?,F(xiàn)使用單一職責(zé)原則對(duì)其進(jìn)行重構(gòu)。單一職責(zé)原則單一職責(zé)原則實(shí)例實(shí)例解析開閉原則開閉原則定義開閉原則是面向?qū)ο蟮目蓮?fù)用設(shè)計(jì)的第一塊基石,是最重要的面向?qū)ο笤O(shè)計(jì)原則開閉原則:軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。Open-ClosedPrinciple(OCP):Softwareentitiesshouldbeopenforextension,butclosedformodification.開閉原則開閉原則分析開閉原則由BertrandMeyer于1988年提出在開閉原則的定義中,軟件實(shí)體可以是一個(gè)軟件模塊、一個(gè)由多個(gè)類組成的局部結(jié)構(gòu)或一個(gè)獨(dú)立的類開閉原則是指軟件實(shí)體應(yīng)盡量在不修改原有代碼的情況下進(jìn)行擴(kuò)展開閉原則開閉原則分析抽象化是開閉原則的關(guān)鍵相對(duì)穩(wěn)定的抽象層+靈活的具體層對(duì)可變性封裝原則(PrincipleofEncapsulationofVariation,EVP):找到系統(tǒng)的可變因素并將其封裝起來(lái)里氏代換原則里氏代換原則定義里氏代換原則:如果對(duì)每一個(gè)類型為S的對(duì)象o1,都有類型為T的對(duì)象o2,使得以T定義的所有程序P在所有的對(duì)象o1都代換o2時(shí),程序P的行為沒(méi)有變化,那么類型S是類型T的子類型。LiskovSubstitutionPrinciple(LSP):Ifforeachobjecto1oftypeSthereisanobjecto2oftypeTsuchthatforallprogramsPdefinedintermsofT,thebehaviorofPisunchangedwheno1issubstitutedforo2thenSisasubtypeofT.里氏代換原則:所有引用基類的地方必須能透明地使用其子類的對(duì)象。LiskovSubstitutionPrinciple(LSP):Functionsthatusepointersorreferencestobaseclassesmustbeabletouseobjectsofderivedclasseswithoutknowingit.里氏代換原則里氏代換原則分析里氏代換原則由2008年圖靈獎(jiǎng)得主、美國(guó)第一位計(jì)算機(jī)科學(xué)女博士、麻省理工學(xué)院教授BarbaraLiskov和卡內(nèi)基.梅隆大學(xué)JeannetteWing教授于1994年提出芭芭拉·利斯科夫(BarbaraLiskov),美國(guó)計(jì)算機(jī)科學(xué)家,2008年圖靈獎(jiǎng)得主,2004年約翰.馮諾依曼獎(jiǎng)得主,美國(guó)工程院院士,美國(guó)藝術(shù)與科學(xué)院院士,美國(guó)計(jì)算機(jī)協(xié)會(huì)會(huì)士?,F(xiàn)任麻省理工學(xué)院電子電氣與計(jì)算機(jī)科學(xué)系教授,她是美國(guó)第一個(gè)計(jì)算機(jī)科學(xué)女博士。里氏代換原則里氏代換原則分析在軟件中將一個(gè)基類對(duì)象替換成它的子類對(duì)象,程序?qū)⒉粫?huì)產(chǎn)生任何錯(cuò)誤和異常,反過(guò)來(lái)則不成立。如果一個(gè)軟件實(shí)體使用的是一個(gè)子類對(duì)象的話,那么它不一定能夠使用基類對(duì)象在程序中盡量使用基類類型來(lái)對(duì)對(duì)象進(jìn)行定義,而在運(yùn)行時(shí)再確定其子類類型我喜歡動(dòng)物我喜歡狗因?yàn)楣肥莿?dòng)物
依賴倒轉(zhuǎn)原則依賴倒轉(zhuǎn)原則定義依賴倒轉(zhuǎn)原則:高層模塊不應(yīng)該依賴低層模塊,它們都應(yīng)該依賴抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。DependencyInversionPrinciple(DIP):Highlevelmodulesshouldnotdependuponlowlevelmodules,bothshoulddependuponabstractions.Abstractionsshouldnotdependupondetails,detailsshoulddependuponabstractions.依賴倒轉(zhuǎn)原則依賴倒轉(zhuǎn)原則定義要針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程Programtoaninterface,notanimplementation.依賴倒轉(zhuǎn)原則依賴倒轉(zhuǎn)原則分析依賴倒轉(zhuǎn)原則是RobertC.Martin在1996年為“C++Reporter”所寫的專欄EngineeringNotebook的第三篇,后來(lái)加入到他在2002年出版的經(jīng)典著作《AgileSoftwareDevelopment,Principles,Patterns,andPractices》一書中依賴倒轉(zhuǎn)原則依賴倒轉(zhuǎn)原則分析在程序代碼中傳遞參數(shù)時(shí)或在關(guān)聯(lián)關(guān)系中,盡量引用層次高的抽象層類,即使用接口和抽象類進(jìn)行變量類型聲明、參數(shù)類型聲明、方法返回類型聲明,以及數(shù)據(jù)類型的轉(zhuǎn)換等在程序中盡量使用抽象層進(jìn)行編程,而將具體類寫在配置文件中依賴倒轉(zhuǎn)原則依賴倒轉(zhuǎn)原則分析針對(duì)抽象層編程,將具體類的對(duì)象通過(guò)依賴注入(DependencyInjection,DI)的方式注入到其他對(duì)象構(gòu)造注入設(shè)值注入(Setter注入)接口注入依賴倒轉(zhuǎn)原則OCP/LSP/DIP綜合實(shí)例實(shí)例說(shuō)明某軟件公司開發(fā)人員在開發(fā)CRM系統(tǒng)時(shí)發(fā)現(xiàn):該系統(tǒng)經(jīng)常需要將存儲(chǔ)在TXT或Excel文件中的客戶信息轉(zhuǎn)存到數(shù)據(jù)庫(kù)中,因此需要進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換。在客戶數(shù)據(jù)操作類CustomerDAO中將調(diào)用數(shù)據(jù)格式轉(zhuǎn)換類的方法來(lái)實(shí)現(xiàn)格式轉(zhuǎn)換,初始設(shè)計(jì)方案結(jié)構(gòu)如圖2-3所示:圖2-3初始設(shè)計(jì)方案結(jié)構(gòu)圖在編碼實(shí)現(xiàn)圖2-3所示結(jié)構(gòu)時(shí),該軟件公司開發(fā)人員發(fā)現(xiàn)該設(shè)計(jì)方案存在一個(gè)非常嚴(yán)重的問(wèn)題,由于每次轉(zhuǎn)換數(shù)據(jù)時(shí)數(shù)據(jù)來(lái)源不一定相同,因此需要經(jīng)常更換數(shù)據(jù)轉(zhuǎn)換類,例如有時(shí)候需要將TXTDataConvertor改為ExcelDataConvertor,此時(shí),需要修改CustomerDAO的源代碼,而且在引入并使用新的數(shù)據(jù)轉(zhuǎn)換類時(shí)也不得不修改CustomerDAO的源代碼,系統(tǒng)擴(kuò)展性較差,違反了開閉原則,需要對(duì)該方案進(jìn)行重構(gòu)。依賴倒轉(zhuǎn)原則OCP/LSP/DIP綜合實(shí)例實(shí)例解析接口隔離原則接口隔離原則定義接口隔離原則:客戶端不應(yīng)該依賴那些它不需要的接口。InterfaceSegregationPrinciple(ISP):Clientsshouldnotbeforcedtodependuponinterfacesthattheydonotuse.接口隔離原則接口隔離原則分析當(dāng)一個(gè)接口太大時(shí),需要將它分割成一些更細(xì)小的接口使用該接口的客戶端僅需知道與之相關(guān)的方法即可每一個(gè)接口應(yīng)該承擔(dān)一種相對(duì)獨(dú)立的角色,不干不該干的事,該干的事都要干接口隔離原則接口隔離原則分析“接口”定義(1):一個(gè)類型所提供的所有方法特征的集合。一個(gè)接口代表一個(gè)角色,每個(gè)角色都有它特定的一個(gè)接口,“角色隔離原則”“接口”定義(2):狹義的特定語(yǔ)言的接口。接口僅僅提供客戶端需要的行為,客戶端不需要的行為則隱藏起來(lái),應(yīng)當(dāng)為客戶端提供盡可能小的單獨(dú)的接口,而不要提供大的總接口,每個(gè)接口中只包含一個(gè)客戶端所需的方法,“定制服務(wù)”接口隔離原則接口隔離原則實(shí)例實(shí)例說(shuō)明某軟件公司開發(fā)人員針對(duì)CRM系統(tǒng)的客戶數(shù)據(jù)顯示模塊設(shè)計(jì)了如圖2-5所示接口,其中方法DataRead()用于從文件中讀取數(shù)據(jù),方法TransformToXML()用于將數(shù)據(jù)轉(zhuǎn)換成XML格式,方法CreateChart()用于創(chuàng)建圖表,方法DisplayChart()用于顯示圖表,方法CreateReport()用于創(chuàng)建文字報(bào)表,方法DisplayReport()用于顯示文字報(bào)表。圖2-5初始設(shè)計(jì)方案結(jié)構(gòu)圖在實(shí)際使用過(guò)程中開發(fā)人員發(fā)現(xiàn)該接口很不靈活,例如:如果一個(gè)具體的數(shù)據(jù)顯示類無(wú)須進(jìn)行數(shù)據(jù)轉(zhuǎn)換(源文件本身就是XML格式),但由于實(shí)現(xiàn)了該接口,不得不實(shí)現(xiàn)其中聲明的TransformToXML()方法(至少需要提供一個(gè)空實(shí)現(xiàn));如果需要?jiǎng)?chuàng)建和顯示圖表,除了需要實(shí)現(xiàn)與圖表相關(guān)的方法外,還需要實(shí)現(xiàn)創(chuàng)建和顯示文字報(bào)表的方法,否則程序在編譯時(shí)將報(bào)錯(cuò)?,F(xiàn)使用接口隔離原則對(duì)其進(jìn)行重構(gòu)。接口隔離原則接口隔離原則實(shí)例實(shí)例解析合成復(fù)用原則合成復(fù)用原則定義合成復(fù)用原則又稱為組合/聚合復(fù)用原則(Composition/AggregateReusePrinciple,CARP)合成復(fù)用原則:優(yōu)先使用對(duì)象組合,而不是繼承來(lái)達(dá)到復(fù)用的目的。CompositeReusePrinciple(CRP):Favorcompositionofobjectsover
inheritanceasareusemechanism.合成復(fù)用原則合成復(fù)用原則分析合成復(fù)用原則就是在一個(gè)新的對(duì)象里通過(guò)關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合關(guān)系)來(lái)使用一些已有的對(duì)象,使之成為新對(duì)象的一部分新對(duì)象通過(guò)委派調(diào)用已有對(duì)象的方法達(dá)到復(fù)用功能的目的復(fù)用時(shí)要盡量使用組合/聚合關(guān)系(關(guān)聯(lián)關(guān)系),少用繼承合成復(fù)用原則合成復(fù)用原則分析繼承復(fù)用:實(shí)現(xiàn)簡(jiǎn)單,易于擴(kuò)展。破壞系統(tǒng)的封裝性;從基類繼承而來(lái)的實(shí)現(xiàn)是靜態(tài)的,不可能在運(yùn)行時(shí)發(fā)生改變,沒(méi)有足夠的靈活性;只能在有限的環(huán)境中使用。(“白箱”復(fù)用)組合/聚合復(fù)用:耦合度相對(duì)較低,有選擇性地調(diào)用成員對(duì)象的操作;可以在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行,新對(duì)象可以動(dòng)態(tài)地引用與成員對(duì)象類型相同的其他對(duì)象。(“黑箱”復(fù)用)合成復(fù)用原則合成復(fù)用原則實(shí)例實(shí)例說(shuō)明某軟件公司開發(fā)人員在初期的CRM系統(tǒng)設(shè)計(jì)中,考慮到客戶數(shù)量不多,系統(tǒng)采用Access作為數(shù)據(jù)庫(kù),與數(shù)據(jù)庫(kù)操作有關(guān)的類,例如CustomerDAO類等都需要連接數(shù)據(jù)庫(kù),連接數(shù)據(jù)庫(kù)的方法GetConnection()封裝在DBUtil類中,由于需要重用DBUtil類的GetConnection()方法,設(shè)計(jì)人員將CustomerDAO作為DBUtil類的子類,初始設(shè)計(jì)方案結(jié)構(gòu)如圖2-7所示。圖2-7初始設(shè)計(jì)方案結(jié)構(gòu)圖隨著客戶數(shù)量的增加,系統(tǒng)決定升級(jí)為Oracle數(shù)據(jù)庫(kù),因此需要增加一個(gè)新的OracleDBUtil類來(lái)連接Oracle數(shù)據(jù)庫(kù),由于在初始設(shè)計(jì)方案中CustomerDAO和DBUtil之間是繼承關(guān)系,因此在更換數(shù)據(jù)庫(kù)連接方式時(shí)需要修改CustomerDAO類的源代碼,將CustomerDAO作為OracleDBUtil的子類,這將違背開閉原則。當(dāng)然也可以直接修改DBUtil類的源代碼,這同樣也違背了開閉原則?,F(xiàn)使用合成復(fù)用原則對(duì)其進(jìn)行重構(gòu)。合成復(fù)用原則合成復(fù)用原則實(shí)例實(shí)例解析迪米特法則迪米特法則定義迪米特法則又稱為最少知識(shí)原則(LeastKnowledgePrinciple,LKP)迪米特法則:每一個(gè)軟件單位對(duì)其他的單位都只有最少的知識(shí),而且局限于那些與本單位密切相關(guān)的軟件單位。LawofDemeter(LoD):Eachunitshouldhaveonlylimitedknowledgeaboutotherunits:onlyunits"closely"relatedtothecurrentunit.迪米特法則迪米特法則分析迪米特法則來(lái)自于1987年美國(guó)東北大學(xué)(NortheasternUniversity)一個(gè)名為“Demeter”的研究項(xiàng)目迪米特法則要求一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用應(yīng)用迪米特法則可降低系統(tǒng)的耦合度,使類與類之間保持松散的耦合關(guān)系迪米特法則迪米特法則分析不要和“陌生人”說(shuō)話
(Don'ttalktostrangers.)只與你的直接朋友通信
(Talkonlytoyourimmediatefriends.)(1)當(dāng)前對(duì)象本身(this)(2)以參數(shù)形式傳入到當(dāng)前對(duì)象方法中的對(duì)象(3)當(dāng)前對(duì)象的成員對(duì)象(4)如果當(dāng)前對(duì)象的成員對(duì)象是一個(gè)集合,那么集合中的元素也都是朋友(5)當(dāng)前對(duì)象所創(chuàng)建的對(duì)象任何一個(gè)對(duì)象,如果滿足上面的條件之一,就是當(dāng)前對(duì)象的“朋友”,否則就是“陌生人”在應(yīng)用迪米特法則時(shí),一個(gè)對(duì)象只能與直接朋友發(fā)生交互,不要和“陌生人”發(fā)生直接交互,這樣做可以降低系統(tǒng)的耦合度,一個(gè)對(duì)象的改變不會(huì)給太多其他對(duì)象帶來(lái)影響迪米特法則迪米特法則分析迪米特法則要求在設(shè)計(jì)系統(tǒng)時(shí),應(yīng)該盡量減少對(duì)象之間的交互如果兩個(gè)對(duì)象之間不必彼此直接通信,那么這兩個(gè)對(duì)象就不應(yīng)該發(fā)生任何直接的相互作用如果其中一個(gè)對(duì)象需要調(diào)用另一個(gè)對(duì)象的方法,可以通過(guò)“第三者”轉(zhuǎn)發(fā)這個(gè)調(diào)用通過(guò)引入一個(gè)合理的“第三者”來(lái)降低現(xiàn)有對(duì)象之間的耦合度迪米特法則迪米特法則分析應(yīng)用迪米特法則注意點(diǎn):在類的劃分上,應(yīng)當(dāng)盡量創(chuàng)建松耦合的類,類之間的耦合度越低,越有利于復(fù)用,一個(gè)處在松耦合中的類一旦被修改,不會(huì)對(duì)關(guān)聯(lián)的類造成太大影響在類的結(jié)構(gòu)設(shè)計(jì)上,每一個(gè)類都應(yīng)當(dāng)盡量降低其成員變量和成員函數(shù)的訪問(wèn)權(quán)限在類的設(shè)計(jì)上,只要有可能,一個(gè)類型應(yīng)當(dāng)設(shè)計(jì)成不變類在對(duì)其他類的引用上,一個(gè)對(duì)象對(duì)其他對(duì)象的引用應(yīng)當(dāng)降到最低迪米特法則迪米特法則實(shí)例實(shí)例說(shuō)明某軟件公司所開發(fā)CRM系統(tǒng)包含很多業(yè)務(wù)操作窗口,在這些窗口中,某些界面控件之間存在復(fù)雜的交互關(guān)系,一個(gè)控件事件的觸發(fā)將導(dǎo)致多個(gè)其他界面控件產(chǎn)生響應(yīng)。例如,當(dāng)一個(gè)按鈕(Button)被單擊時(shí),對(duì)應(yīng)的列表框(List)、組合框(ComboBox)、文本框(TextBox)、文本標(biāo)簽(Label)等都將發(fā)生改變,在初始設(shè)計(jì)方案中,界面控件之間的交互關(guān)系可以簡(jiǎn)化為如圖2-9所示的結(jié)構(gòu)。圖2-9初始設(shè)計(jì)方案結(jié)構(gòu)圖在圖2-9中,由于界面控件之間的交互關(guān)系復(fù)雜,導(dǎo)致在該窗口中增加新的界面控件時(shí)需要修改與之交互的其他控件的源代碼,系統(tǒng)擴(kuò)展性較差,也不便于增加和刪除控件?,F(xiàn)使用迪米特法則對(duì)其進(jìn)行重構(gòu)。迪米特法則迪米特法則實(shí)例實(shí)例解析ENDThanks!Thanks!DesignPatterns簡(jiǎn)單工廠模式劉偉(Sunny)weiliu_china@126.com大綱創(chuàng)建型模式簡(jiǎn)單工廠模式概述簡(jiǎn)單工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)簡(jiǎn)單工廠模式的應(yīng)用實(shí)例創(chuàng)建對(duì)象與使用對(duì)象簡(jiǎn)單工廠模式的簡(jiǎn)化簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn)與適用環(huán)境創(chuàng)建型模式創(chuàng)建型模式(CreationalPattern)關(guān)注對(duì)象的創(chuàng)建過(guò)程創(chuàng)建型模式對(duì)類的實(shí)例化過(guò)程進(jìn)行了抽象,能夠?qū)④浖K中對(duì)象的創(chuàng)建和對(duì)象的使用分離,對(duì)用戶隱藏了類的實(shí)例的創(chuàng)建細(xì)節(jié)創(chuàng)建型模式描述如何將對(duì)象的創(chuàng)建和使用分離,讓用戶在使用對(duì)象時(shí)無(wú)須關(guān)心對(duì)象的創(chuàng)建細(xì)節(jié),從而降低系統(tǒng)的耦合度,讓設(shè)計(jì)方案更易于修改和擴(kuò)展創(chuàng)建型模式創(chuàng)建型模式關(guān)注點(diǎn)創(chuàng)建什么(What)由誰(shuí)創(chuàng)建(Who)何時(shí)創(chuàng)建(When)創(chuàng)建對(duì)象使用對(duì)象創(chuàng)建型模式創(chuàng)建型模式一覽表模式名稱定義學(xué)習(xí)難度使用頻率簡(jiǎn)單工廠模式(SimpleFactoryPattern)定義一個(gè)工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類?!铩铩睢睢睢铩铩铩睢罟S方法模式(FactoryMethodPattern)定義一個(gè)用于創(chuàng)建對(duì)象的接口,但是讓子類決定將哪一個(gè)類實(shí)例化。工廠方法模式讓一個(gè)類的實(shí)例化延遲到其子類?!铩铩睢睢睢铩铩铩铩锍橄蠊S模式(AbstractFactoryPattern)提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)須指定它們具體的類?!铩铩铩铩睢铩铩铩铩锝ㄔ煺吣J?BuilderPattern)將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示?!铩铩铩铩睢铩铩睢睢钤湍J?PrototypePattern)使用原型實(shí)例指定待創(chuàng)建對(duì)象的類型,并且通過(guò)復(fù)制這個(gè)原型來(lái)創(chuàng)建新的對(duì)象?!铩铩铩睢睢铩铩铩睢顔卫J?SingletonPattern)確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)來(lái)訪問(wèn)這個(gè)唯一實(shí)例?!铩睢睢睢睢铩铩铩铩詈?jiǎn)單工廠模式概述簡(jiǎn)單工廠模式示意圖客戶端工廠產(chǎn)品參數(shù)簡(jiǎn)單工廠模式概述簡(jiǎn)單工廠模式基本實(shí)現(xiàn)流程具體產(chǎn)品類:將需要?jiǎng)?chuàng)建的各種不同產(chǎn)品對(duì)象的相關(guān)代碼封裝到具體產(chǎn)品類中抽象產(chǎn)品類:將具體產(chǎn)品類公共的代碼進(jìn)行抽象和提取后封裝在一個(gè)抽象產(chǎn)品類中工廠類:提供一個(gè)工廠類用于創(chuàng)建各種產(chǎn)品,在工廠類中提供一個(gè)創(chuàng)建產(chǎn)品的工廠方法,該方法可以根據(jù)所傳入?yún)?shù)的不同創(chuàng)建不同的具體產(chǎn)品對(duì)象客戶端:只需調(diào)用工廠類的工廠方法并傳入相應(yīng)的參數(shù)即可得到一個(gè)產(chǎn)品對(duì)象簡(jiǎn)單工廠模式概述簡(jiǎn)單工廠模式的定義類創(chuàng)建型模式簡(jiǎn)單工廠模式(SimpleFactoryPattern):定義一個(gè)工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。簡(jiǎn)單工廠模式概述簡(jiǎn)單工廠模式的定義在簡(jiǎn)單工廠模式中用于創(chuàng)建實(shí)例的方法通常是靜態(tài)(static)方法,因此又被稱為靜態(tài)工廠方法(StaticFactoryMethod)模式要點(diǎn):如果需要什么,只需要傳入一個(gè)正確的參數(shù),就可以獲取所需要的對(duì)象,而無(wú)須知道其創(chuàng)建細(xì)節(jié)簡(jiǎn)單工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)簡(jiǎn)單工廠模式的結(jié)構(gòu)簡(jiǎn)單工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)簡(jiǎn)單工廠模式的結(jié)構(gòu)簡(jiǎn)單工廠模式包含以下3個(gè)角色:Factory(工廠角色)Product(抽象產(chǎn)品角色)ConcreteProduct(具體產(chǎn)品角色)簡(jiǎn)單工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)簡(jiǎn)單工廠模式的實(shí)現(xiàn)典型的抽象產(chǎn)品類代碼:abstractclassProduct{//所有產(chǎn)品類的公共業(yè)務(wù)方法publicvoidMethodSame(){//公共方法的實(shí)現(xiàn)}//聲明抽象業(yè)務(wù)方法publicabstractvoidMethodDiff();}簡(jiǎn)單工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)簡(jiǎn)單工廠模式的實(shí)現(xiàn)典型的具體產(chǎn)品類代碼:classConcreteProductA:Product{//實(shí)現(xiàn)業(yè)務(wù)方法publicoverridevoidMethodDiff(){//業(yè)務(wù)方法的實(shí)現(xiàn)}}簡(jiǎn)單工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)簡(jiǎn)單工廠模式的實(shí)現(xiàn)典型的工廠類代碼:classFactory{//靜態(tài)工廠方法
publicstaticProductGetProduct(stringarg){Productproduct=null;if(arg.Equals("A")){product=newConcreteProductA();//初始化設(shè)置product}elseif(arg.Equals("B")){product=newConcreteProductB();//初始化設(shè)置product}returnproduct;}}簡(jiǎn)單工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)簡(jiǎn)單工廠模式的實(shí)現(xiàn)典型的客戶端代碼:classProgram{staticvoidMain(string[]args){Productproduct;product=Factory.GetProduct("A");//通過(guò)工廠類創(chuàng)建產(chǎn)品對(duì)象
product.MethodSame();product.MethodDiff();}}簡(jiǎn)單工廠模式的應(yīng)用實(shí)例實(shí)例說(shuō)明某軟件公司要基于C#語(yǔ)言開發(fā)一套圖表庫(kù),該圖表庫(kù)可以為應(yīng)用系統(tǒng)提供多種不同外觀的圖表,例如柱狀圖(HistogramChart)、餅狀圖(PieChart)、折線圖(LineChart)等。該軟件公司圖表庫(kù)設(shè)計(jì)人員希望為應(yīng)用系統(tǒng)開發(fā)人員提供一套靈活易用的圖表庫(kù),通過(guò)設(shè)置不同的參數(shù)即可得到不同類型的圖表,而且可以較為方便地對(duì)圖表庫(kù)進(jìn)行擴(kuò)展,以便能夠在將來(lái)增加一些新類型的圖表?,F(xiàn)使用簡(jiǎn)單工廠模式來(lái)設(shè)計(jì)該圖表庫(kù)。簡(jiǎn)單工廠模式的應(yīng)用實(shí)例實(shí)例類圖圖表庫(kù)結(jié)構(gòu)圖簡(jiǎn)單工廠模式的應(yīng)用實(shí)例實(shí)例代碼(1)Chart:抽象圖表接口,充當(dāng)抽象產(chǎn)品類(2)HistogramChart:柱狀圖類,充當(dāng)具體產(chǎn)品類(3)PieChart:餅狀圖類,充當(dāng)具體產(chǎn)品類(4)LineChart:折線圖類,充當(dāng)具體產(chǎn)品類(5)ChartFactory:圖表工廠類,充當(dāng)工廠類(6)Program:客戶端測(cè)試類演示……參考代碼(DesignPattern\SimpleFactory)簡(jiǎn)單工廠模式的應(yīng)用實(shí)例結(jié)果及分析引入配置文件:App.config……Chartchart;chart=ChartFactory.GetChart("histogram");//通過(guò)靜態(tài)工廠方法創(chuàng)建產(chǎn)品……<?xmlversion="1.0"encoding="utf-8"?><configuration><appSettings><addkey="chartType"value="histogram"/></appSettings></configuration>usingSystem.Configuration;……Chartchart;//讀取配置文件stringchartStr=ConfigurationManager.AppSettings["chartType"];chart=ChartFactory.GetChart(chartStr);//通過(guò)靜態(tài)工廠方法創(chuàng)建產(chǎn)品……創(chuàng)建對(duì)象與使用對(duì)象C#語(yǔ)言創(chuàng)建對(duì)象的幾種方式使用new關(guān)鍵字直接創(chuàng)建對(duì)象通過(guò)反射機(jī)制創(chuàng)建對(duì)象通過(guò)克隆方法創(chuàng)建對(duì)象通過(guò)工廠類創(chuàng)建對(duì)象創(chuàng)建對(duì)象與使用對(duì)象實(shí)例分析使用new關(guān)鍵字創(chuàng)建對(duì)象classLogin{ privateUserDAOudao;
publicLogin(){ udao=newOracleUserDAO();//創(chuàng)建對(duì)象 }
publicvoidExecute(){ //其他代碼 udao.FindUserById();//使用對(duì)象 //其他代碼 }}若改為SQLServerUserDAO必須修改源代碼,違背開閉原則創(chuàng)建對(duì)象與使用對(duì)象實(shí)例分析引入工廠類UserDAOFactory創(chuàng)建對(duì)象與使用對(duì)象實(shí)例分析引入工廠類UserDAOFactory如果UserDAO的某個(gè)子類的構(gòu)造函數(shù)發(fā)生改變或者需要添加或移除不同的子類,只要維護(hù)UserDAOFactory的代碼,不會(huì)影響到Login如果UserDAO的接口發(fā)生改變,例如添加、移除方法或改變方法名,只需要修改Login,不會(huì)給UserDAOFactory帶來(lái)任何影響兩個(gè)類A和B之間的關(guān)系應(yīng)該僅僅是A創(chuàng)建B或者是A使用B,而不能兩種關(guān)系都有。將對(duì)象的創(chuàng)建和使用分離,使得系統(tǒng)更加符合單一職責(zé)原則,有利于對(duì)功能的復(fù)用和系統(tǒng)的維護(hù)。創(chuàng)建對(duì)象與使用對(duì)象將對(duì)象的創(chuàng)建與使用分離的其他好處防止用來(lái)實(shí)例化一個(gè)類的數(shù)據(jù)和代碼在多個(gè)類中到處都是,可以將有關(guān)創(chuàng)建的知識(shí)搬移到一個(gè)工廠類中,解決代碼重復(fù)、創(chuàng)建蔓延的問(wèn)題構(gòu)造函數(shù)的名字都與類名相同,從構(gòu)造函數(shù)和參數(shù)列表中大家很難了解不同構(gòu)造函數(shù)所構(gòu)造的產(chǎn)品的差異
將對(duì)象的創(chuàng)建過(guò)程封裝在工廠類中,可以提供一系列名字完全不同的工廠方法,每一個(gè)工廠方法對(duì)應(yīng)一個(gè)構(gòu)造函數(shù),客戶端可以以一種更加可讀、易懂的方式來(lái)創(chuàng)建對(duì)象創(chuàng)建對(duì)象與使用對(duì)象何時(shí)不需要工廠?無(wú)須為系統(tǒng)中的每一個(gè)類都配備一個(gè)工廠類如果一個(gè)類很簡(jiǎn)單,而且不存在太多變化,其構(gòu)造過(guò)程也很簡(jiǎn)單,此時(shí)就無(wú)須為其提供工廠類,直接在使用之前實(shí)例化即可否則會(huì)導(dǎo)致工廠泛濫,增加系統(tǒng)的復(fù)雜度例如:string類簡(jiǎn)單工廠模式的簡(jiǎn)化將抽象產(chǎn)品類和工廠類合并,將靜態(tài)工廠方法移至抽象產(chǎn)品類中簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn)與適用環(huán)境模式優(yōu)點(diǎn)實(shí)現(xiàn)了對(duì)象創(chuàng)建和使用的分離客戶端無(wú)須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對(duì)應(yīng)的參數(shù)即可通過(guò)引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,在一定程度上提高了系統(tǒng)的靈活性簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn)與適用環(huán)境模式缺點(diǎn)工廠類集中了所有產(chǎn)品的創(chuàng)建邏輯,職責(zé)過(guò)重,一旦不能正常工作,整個(gè)系統(tǒng)都要受到影響增加系統(tǒng)中類的個(gè)數(shù)(引入了新的工廠類),增加了系統(tǒng)的復(fù)雜度和理解難度系統(tǒng)擴(kuò)展困難,一旦添加新產(chǎn)品不得不修改工廠邏輯由于使用了靜態(tài)工廠方法,造成工廠角色無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu),工廠類不能得到很好地?cái)U(kuò)展簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn)與適用環(huán)境模式適用環(huán)境工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少,由于創(chuàng)建的對(duì)象較少,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯太過(guò)復(fù)雜客戶端只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象并不關(guān)心ENDThanks!Thanks!DesignPatterns工廠方法模式劉偉(Sunny)weiliu_china@126.com大綱工廠方法模式概述工廠方法模式的結(jié)構(gòu)與實(shí)現(xiàn)工廠方法模式的應(yīng)用實(shí)例配置文件與反射工廠方法的重載工廠方法的隱藏工廠方法模式的優(yōu)缺點(diǎn)與適用環(huán)境工廠方法模式概述使用簡(jiǎn)單工廠模式設(shè)計(jì)的按鈕工廠工廠方法模式概述使用工廠方法模式改進(jìn)后的按鈕工廠工廠方法模式概述分析工廠方法模式:不再提供一個(gè)按鈕工廠類來(lái)統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體按鈕的創(chuàng)建過(guò)程交給專門的工廠子類去完成如果出現(xiàn)新的按鈕類型,只需要為這種新類型的按鈕定義一個(gè)具體的工廠類就可以創(chuàng)建該新按鈕的實(shí)例開閉原則工廠方法模式概述工廠方法模式的定義類創(chuàng)建型模式工廠方法模式:定義一個(gè)用于創(chuàng)建對(duì)象的接口,但是讓子類決定將哪一個(gè)類實(shí)例化。工廠方法模式讓一個(gè)類的實(shí)例化延遲到其子類。FactoryMethodPattern:Defineaninterfaceforcreatinganobject,butletsubclassesdecidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.工廠方法模式概述工廠方法模式的定義簡(jiǎn)稱為工廠模式(FactoryPattern)又可稱作虛擬構(gòu)造器模式(VirtualConstructorPattern)或多態(tài)工廠模式(PolymorphicFactoryPattern)工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過(guò)工廠子類來(lái)確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類工廠方法模式的結(jié)構(gòu)與實(shí)現(xiàn)工廠方法模式的結(jié)構(gòu)工廠方法模式的結(jié)構(gòu)與實(shí)現(xiàn)工廠方法模式的結(jié)構(gòu)工廠方法模式包含以下4個(gè)角色:Product(抽象產(chǎn)品)ConcreteProduct(具體產(chǎn)品)Factory(抽象工廠)ConcreteFactory(具體工廠)工廠方法模式的結(jié)構(gòu)與實(shí)現(xiàn)工廠方法模式的實(shí)現(xiàn)典型的抽象工廠類代碼:interfaceFactory{ProductFactoryMethod();}工廠方法模式的結(jié)構(gòu)與實(shí)現(xiàn)工廠方法模式的實(shí)現(xiàn)典型的具體工廠類代碼:classConcreteFactory:Factory{publicProductFactoryMethod(){returnnewConcreteProduct();}}工廠方法模式的結(jié)構(gòu)與實(shí)現(xiàn)工廠方法模式的實(shí)現(xiàn)典型的客戶端代碼片段:……Factoryfactory;factory=newConcreteFactory();//可通過(guò)配置文件實(shí)現(xiàn)Productproduct;product=factory.FactoryMethod();……工廠方法模式的應(yīng)用實(shí)例實(shí)例說(shuō)明某系統(tǒng)運(yùn)行日志記錄器(Logger)可以通過(guò)多種途徑保存系統(tǒng)的運(yùn)行日志,例如通過(guò)文件記錄或數(shù)據(jù)庫(kù)記錄,用戶可以通過(guò)修改配置文件靈活地更換日志記錄方式。在設(shè)計(jì)各類日志記錄器時(shí),開發(fā)人員發(fā)現(xiàn)需要對(duì)日志記錄器進(jìn)行一些初始化工作,初始化參數(shù)的設(shè)置過(guò)程較為復(fù)雜,而且某些參數(shù)的設(shè)置有嚴(yán)格的先后次序,否則可能會(huì)發(fā)生記錄失敗。為了更好地封裝記錄器的初始化過(guò)程并保證多種記錄器切換的靈活性,現(xiàn)使用工廠方法模式設(shè)計(jì)該系統(tǒng)。(在.NET平臺(tái)下常用的日志記錄工具有Log4net、NLog等,.NETFramework也提供了一些用于記錄日志的類,例如Debug、Trace、TraceSource等。)工廠方法模式的應(yīng)用實(shí)例實(shí)例類圖日志記錄器結(jié)構(gòu)圖工廠方法模式的應(yīng)用實(shí)例實(shí)例代碼(1)Logger:日志記錄器接口,充當(dāng)抽象產(chǎn)品角色(2)DatabaseLogger:數(shù)據(jù)庫(kù)日志記錄器,充當(dāng)具體產(chǎn)品角色(3)FileLogger:文件日志記錄器,充當(dāng)具體產(chǎn)品角色(4)LoggerFactory:日志記錄器工廠接口,充當(dāng)抽象工廠角色(5)DatabaseLoggerFactory:數(shù)據(jù)庫(kù)日志記錄器工廠類,充當(dāng)具體工廠角色(6)FileLoggerFactory:文件日志記錄器工廠類,充當(dāng)具體工廠角色(7)Program:客戶端測(cè)試類演示……參考代碼(DesignPattern\FactoryMethodSample)工廠方法模式的應(yīng)用實(shí)例結(jié)果及分析在未使用配置文件和反射機(jī)制之前,更換具體工廠類需修改客戶端源代碼,但無(wú)須修改類庫(kù)代碼配置文件與反射配置文件純文本文件,通常是XML文件,例如App.config、Web.config等可以將類名存儲(chǔ)在配置文件中,例如具體工廠類的類名<?xmlversion="1.0"encoding="utf-8"?><configuration><appSettings><addkey="factory"value="FactoryMethodSample.FileLoggerFactory"/></appSettings></configuration>配置文件與反射反射(Reflection)在運(yùn)行時(shí)獲得.NET中每一個(gè)類型(包括類、結(jié)構(gòu)、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構(gòu)造函數(shù)等,還可以獲得每個(gè)成員的名稱、限定符和參數(shù)等由于獲取了構(gòu)造函數(shù)的信息,因此可以通過(guò)類名來(lái)直接創(chuàng)建對(duì)象,即使這個(gè)對(duì)象的類型在編譯時(shí)是未知的配置文件與反射反射(Reflection)//導(dǎo)入命名空間usingSystem.Reflection;Assemblyassembly=Assembly.Load("程序集名稱");objectobj=assembly.CreateInstance("命名空間.類");//導(dǎo)入命名空間usingSystem.Reflection;objectobj=Assembly.Load("程序集名稱").CreateInstance("命名空間.類");配置文件與反射修改后的客戶端代碼usingSystem;usingSystem.Configuration;usingSystem.Reflection;namespaceFactoryMethodSample{classProgram{staticvoidMain(string[]args){LoggerFactoryfactory;//針對(duì)抽象工廠類編程Loggerlogger;//針對(duì)抽象產(chǎn)品類編程//讀取配置文件
stringfactoryString=ConfigurationManager.AppSettings["factory"];//反射生成對(duì)象
factory=(LoggerFactory)Assembly.Load("FactoryMethodSample").CreateInstance(factoryString);logger=factory.CreateLogger();logger.WriteLog();Console.Read();}}}配置文件與反射增加新產(chǎn)品的步驟(1)增加一個(gè)新的具體產(chǎn)品類作為抽象產(chǎn)品類的子類(2)增加一個(gè)新的具體工廠類作為抽象工廠類的子類,該工廠用于創(chuàng)建新增的具體產(chǎn)品對(duì)象(3)修改配置文件,用新的具體工廠類的類名字符串替換原有工廠類類名字符串(4)編譯新增具體產(chǎn)品類和具體工廠類,運(yùn)行客戶端代碼,即可完成新產(chǎn)品的增加和使用工廠方法的重載結(jié)構(gòu)圖工廠方法的重載抽象工廠類LoggerFactory示意代碼:interfaceLoggerFactory{ LoggerCreateLogger(); LoggerCreateLogger(stringargs); LoggerCreateLogger(objectobj);}工廠方法的重載具體工廠類DatabaseLoggerFactory示意代碼:classDatabaseLoggerFactory:LoggerFactory{ publicLoggerCreateLogger(){ //使用默認(rèn)方式連接數(shù)據(jù)庫(kù),代碼省略 Loggerlogger=newDatabaseLogger(); //初始化數(shù)據(jù)庫(kù)日志記錄器,代碼省略 returnlogger; } publicLoggerCreateLogger(stringargs){ //使用參數(shù)args作為連接字符串來(lái)連接數(shù)據(jù)庫(kù),代碼省略 Loggerlogger=newDatabaseLogger(); //初始化數(shù)據(jù)庫(kù)日志記錄器,代碼省略 returnlogger; } publicLoggerCreateLogger(objectobj){ //使用封裝在參數(shù)obj中的連接字符串來(lái)連接數(shù)據(jù)庫(kù),代碼省略 Loggerlogger=newDatabaseLogger(); //使用封裝在參數(shù)obj中的數(shù)據(jù)來(lái)初始化數(shù)據(jù)庫(kù)日志記錄器,代碼省略 returnlogger; } }//其他具體工廠類代碼省略工廠方法的隱藏目的:為了進(jìn)一步簡(jiǎn)化客戶端的使用實(shí)現(xiàn):在工廠類中直接調(diào)用產(chǎn)品類的業(yè)務(wù)方法,客戶端無(wú)須調(diào)用工廠方法創(chuàng)建產(chǎn)品對(duì)象,直接使用工廠對(duì)象即可調(diào)用所創(chuàng)建的產(chǎn)品對(duì)象中的業(yè)務(wù)方法工廠方法的隱藏抽象工廠類LoggerFactory示意代碼://將接口改為抽象類abstractclassLoggerFactory{//在工廠類中直接調(diào)用日志記錄器類的業(yè)務(wù)方法WriteLog() publicvoidWriteLog(){ Loggerlogger=this.CreateLogger(); logger.WriteLog(); }
publicabstractLoggerCreateLogger(); }工廠方法的隱藏客戶端代碼:usingSystem;usingSystem.Configuration;usingSystem.Reflection;namespaceFactoryMethodSample{classProgram{staticvoidMain(string[]args){LoggerFactoryfactory;//針對(duì)抽象工廠類編程//讀取配置文件stringfactoryString=ConfigurationManager.AppSettings["factory"];//反射生成對(duì)象factory=(LoggerFactory)Assembly.Load("FactoryMethodSample").CreateInstance(factoryString);factory.WriteLog();//直接使用工廠對(duì)象來(lái)調(diào)用產(chǎn)品對(duì)象的業(yè)務(wù)方法Console.Read();}}}工廠方法模式的優(yōu)缺點(diǎn)與適用環(huán)境模式優(yōu)點(diǎn)工廠方法用來(lái)創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié)能夠讓工廠自主確定創(chuàng)建何種產(chǎn)品對(duì)象,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部在系統(tǒng)中加入新產(chǎn)品時(shí),完全符合開閉原則工廠方法模式的優(yōu)缺點(diǎn)與適用環(huán)境模式缺點(diǎn)系統(tǒng)中類的個(gè)數(shù)將成對(duì)增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,會(huì)給系統(tǒng)帶來(lái)一些額外的開銷增加了系統(tǒng)的抽象性和理解難度工廠方法模式的優(yōu)缺點(diǎn)與適用環(huán)境模式適用環(huán)境客戶端不知道它所需要的對(duì)象的類(客戶端不需要知道具體產(chǎn)品類的類名,只需要知道所對(duì)應(yīng)的工廠即可,具體產(chǎn)品對(duì)象由具體工廠類創(chuàng)建)抽象工廠類通過(guò)其子類來(lái)指定創(chuàng)建哪個(gè)對(duì)象ENDThanks!Thanks!DesignPatterns抽象工廠模式劉偉(Sunny)weiliu_china@126.com大綱產(chǎn)品等級(jí)結(jié)構(gòu)與產(chǎn)品族抽象工廠模式概述抽象工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)抽象工廠模式的應(yīng)用實(shí)例開閉原則的傾斜性抽象工廠模式的優(yōu)缺點(diǎn)與適用環(huán)境產(chǎn)品等級(jí)結(jié)構(gòu)與產(chǎn)品族工廠方法模式每個(gè)具體工廠只有一個(gè)或者一組重載的工廠方法,只能生產(chǎn)一種產(chǎn)品,可能會(huì)導(dǎo)致系統(tǒng)中存在大量的工廠類,勢(shì)必會(huì)增加系統(tǒng)的開銷抽象工廠模式一個(gè)工廠可以生產(chǎn)一系列產(chǎn)品(一族產(chǎn)品),極大減少了工廠類的數(shù)量產(chǎn)品等級(jí)結(jié)構(gòu)與產(chǎn)品族概念產(chǎn)品等級(jí)結(jié)構(gòu):產(chǎn)品等級(jí)結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu)產(chǎn)品族:產(chǎn)品族是指由同一個(gè)工廠生產(chǎn)的,位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中的一組產(chǎn)品五個(gè)產(chǎn)品族,分屬于三個(gè)不同的產(chǎn)品等級(jí)結(jié)構(gòu)抽象工廠模式概述模式動(dòng)機(jī)當(dāng)系統(tǒng)所提供的工廠生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡(jiǎn)單的對(duì)象,而是多個(gè)位于不同產(chǎn)品等級(jí)結(jié)構(gòu)、屬于不同類型的具體產(chǎn)品時(shí)就可以使用抽象工廠模式抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形式抽象工廠模式概述抽象工廠模式的定義對(duì)象創(chuàng)建型模式抽象工廠模式:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)須指定它們具體的類。AbstractFactoryPattern:Provideaninterfaceforcreatingfamiliesofrelatedordependentobjectswithoutspecifyingtheirconcreteclasses.抽象工廠模式概述抽象工廠模式的定義又稱為工具(Kit)模式抽象工廠模式中的具體工廠不只是創(chuàng)建一種產(chǎn)品,它負(fù)責(zé)創(chuàng)建一族產(chǎn)品當(dāng)一個(gè)工廠等級(jí)結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級(jí)結(jié)構(gòu)的一個(gè)產(chǎn)品族中的所有對(duì)象時(shí),抽象工廠模式比工廠方法模式更為簡(jiǎn)單、更有效率抽象工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)抽象工廠模式的結(jié)構(gòu)抽象工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)抽象工廠模式的結(jié)構(gòu)抽象工廠模式包含以下4個(gè)角色:AbstractFactory(抽象工廠)ConcreteFactory(具體工廠)AbstractProduct(抽象產(chǎn)品)ConcreteProduct(具體產(chǎn)品)抽象工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)抽象工廠模式的實(shí)現(xiàn)典型的抽象工廠類代碼:abstractclassAbstractFactory{publicabstractAbstractProductACreateProductA();//工廠方法一publicabstractAbstractProductBCreateProductB();//工廠方法二……}抽象工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)抽象工廠模式的實(shí)現(xiàn)典型的具體工廠類代碼:classConcreteFactory1:AbstractFactory{
//工廠方法一publicoverrideAbstractProductACreateProductA(){returnnewConcreteProductA1();}//工廠方法二publicoverrideAbstractProductBCreateProductB(){returnnewConcreteProductB1();}……}抽象工廠模式的應(yīng)用實(shí)例實(shí)例說(shuō)明某軟件公司要開發(fā)一套界面皮膚庫(kù),可以對(duì)基于.NET平臺(tái)的桌面軟件進(jìn)行界面美化。用戶在使用時(shí)可以通過(guò)菜單來(lái)選擇皮膚,不同的皮膚將提供視覺(jué)效果不同的按鈕、文本框、組合框等界面元素,例如春天(Spring)風(fēng)格的皮膚將提供淺綠色的按鈕、綠色邊框的文本框和綠色邊框的組合框,而夏天(Summer)風(fēng)格的皮膚則提供淺藍(lán)色的按鈕、藍(lán)色邊框的文本框和藍(lán)色邊框的組合框,其結(jié)構(gòu)示意圖如下圖所示:該皮膚庫(kù)需要具備良好的靈活性和可擴(kuò)展性,用戶可以自由選擇不同的皮膚,開發(fā)人員可以在不修改既有代碼的基礎(chǔ)上增加新的皮膚?,F(xiàn)使用抽象工廠模式來(lái)設(shè)計(jì)該界面皮膚庫(kù)。界面皮膚庫(kù)結(jié)構(gòu)示意圖抽象工廠模式的應(yīng)用實(shí)例實(shí)例類圖界面皮膚庫(kù)結(jié)構(gòu)圖抽象工廠模式的應(yīng)用實(shí)例實(shí)例代碼(1)Button:按鈕接口,充當(dāng)抽象產(chǎn)品(2)SpringButton:Spring按鈕類,充當(dāng)具體產(chǎn)品(3)SummerButton:Summer按鈕類,充當(dāng)具體產(chǎn)品(4)TextField:文本框接口,充當(dāng)抽象產(chǎn)品(5)SpringText
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年竹溪縣民政局關(guān)于公辦養(yǎng)老機(jī)構(gòu)招聘消防設(shè)施操作員的備考題庫(kù)及參考答案詳解1套
- 湖北中考?xì)v史三年(2023-2025)真題分類匯編專題06 綜合題(解析版)
- 2026年泰和縣人民法院公開招聘聘任制司法輔助人員備考題庫(kù)完整參考答案詳解
- 2025-2030中國(guó)膳食纖維行業(yè)運(yùn)行現(xiàn)狀及發(fā)展趨勢(shì)分析研究報(bào)告
- 2025至2030中國(guó)職業(yè)教育培訓(xùn)市場(chǎng)需求變化與商業(yè)模式分析報(bào)告
- 機(jī)關(guān)培訓(xùn)教學(xué)
- 2025至2030中國(guó)智能電網(wǎng)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資政策支持研究報(bào)告
- 智慧農(nóng)業(yè)技術(shù)推廣障礙及解決方案與投資可行性分析
- 2025-2030中醫(yī)藥產(chǎn)業(yè)發(fā)展特點(diǎn)分析與現(xiàn)代技術(shù)融合路徑探索及中藥材標(biāo)準(zhǔn)化體系建設(shè)研究
- 2026年昭通市永善縣緊密型醫(yī)共體溪洛渡街道衛(wèi)生院分院招聘9人備考題庫(kù)有答案詳解
- 反制無(wú)人機(jī)課件
- 光伏項(xiàng)目后期運(yùn)營(yíng)維護(hù)管理方案
- 材料作文(原卷版)-2026年中考語(yǔ)文復(fù)習(xí)試題(浙江專用)
- 衰老標(biāo)志物人工智能數(shù)據(jù)模型建立應(yīng)用指南
- 2025至2030中國(guó)球囊膽管導(dǎo)管行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 生物樣本資源庫(kù)建設(shè)計(jì)劃及管理工作方案
- 消防安全管理人責(zé)任書范文
- 光伏電站安全事故案例
- 重癥肺炎患者護(hù)理要點(diǎn)回顧查房
- 住院醫(yī)師規(guī)范化培訓(xùn)階段考核(年度考核、出科考核)
- 學(xué)堂在線 雨課堂 學(xué)堂云 中國(guó)建筑史-元明清與民居 期末考試答案
評(píng)論
0/150
提交評(píng)論