日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

設(shè)計(jì)模式之創(chuàng)建型模式

 昵稱22369024 2015-05-03

GoF的設(shè)計(jì)模式一共23個(gè),可以分為3大類:創(chuàng)建型、結(jié)構(gòu)型和行為型,這篇文章主要討論創(chuàng)建型。

  創(chuàng)建型的設(shè)計(jì)模式包括:簡(jiǎn)單工廠(Simple Factory)、工廠方法(Factory Method)、抽象工廠(Abstract Factory)、單例(Singleton)、構(gòu)造者(Builder)和原型(Prototype),我們分別來討論。

  我們首先來看工廠系列的3個(gè)設(shè)計(jì)模式,它們都主要是針對(duì)軟件設(shè)計(jì)中的“開放-封閉”原則,即程序應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改封閉。特別是當(dāng)我們的程序采用XML+反射的方式來創(chuàng)建對(duì)象時(shí),工廠模式的威力就完全展現(xiàn)出來了,這時(shí)我們可以通過維護(hù)配置文件的方式,來控制程序的邏輯。

  1)簡(jiǎn)單工廠,當(dāng)我們的程序在實(shí)例化對(duì)象時(shí),如果輸入條件不一樣,產(chǎn)生的對(duì)象也不一樣,那么我們可以考慮使用簡(jiǎn)單工廠對(duì)不同的實(shí)例進(jìn)行統(tǒng)一封裝, UML結(jié)構(gòu)如下:

    

  優(yōu)點(diǎn):封裝了具體對(duì)象的實(shí)例化過程,Client端和具體對(duì)象解耦,同時(shí)ProductManager可以作成靜態(tài)類或者Singleton對(duì)象,然后可以使用HashMap緩存具體對(duì)象(前提是對(duì)象沒有時(shí)間依賴性),降低創(chuàng)建對(duì)象的次數(shù)。

  缺點(diǎn):當(dāng)增添一種新類型的對(duì)象時(shí),需要修改Productmanager的代碼(如果不采用XML)

  2)工廠方法,它是針對(duì)簡(jiǎn)單工廠的改進(jìn)版,添加了對(duì)ProductManager的抽象,UML結(jié)構(gòu)如下:

    

  優(yōu)點(diǎn):結(jié)構(gòu)更加靈活,對(duì)于某種類型的對(duì)象來說,會(huì)有一個(gè)特定的對(duì)象工廠指向它,這樣當(dāng)我們需要添加一種新類型的產(chǎn)品時(shí),只需要添加兩個(gè)類,一個(gè)是具體產(chǎn)品類,一個(gè)是新產(chǎn)品的工廠類。這樣更加靈活。

  缺點(diǎn):結(jié)構(gòu)開始變得復(fù)雜,而且最終還是需要Client端來確定究竟使用哪一個(gè)Factory(當(dāng)然這個(gè)信息可以保存在上下文或者配置文件中)。

  3)抽象工廠,這個(gè)是最復(fù)雜的工廠模式,它用來生成一個(gè)產(chǎn)品線上的所有產(chǎn)品,我們假設(shè)一個(gè)產(chǎn)品線上包括多個(gè)產(chǎn)品,不同的產(chǎn)品線上的產(chǎn)品個(gè)數(shù)是一樣的,這樣我們需要一個(gè)針對(duì)產(chǎn)品線的抽象,并且很顯然不同產(chǎn)品線上的產(chǎn)品是不可能混到一起的。對(duì)應(yīng)的UML結(jié)構(gòu)圖如下:

  

  上圖表明,一個(gè)產(chǎn)品線上的產(chǎn)品由IProduct1和IProduct2組成,客戶端在獲取產(chǎn)品時(shí),這兩個(gè)產(chǎn)品應(yīng)該是同時(shí)返回的,因此對(duì)于IProductManager來說,它需要同時(shí)生成這兩個(gè)對(duì)象。

  優(yōu)點(diǎn):對(duì)創(chuàng)建產(chǎn)品家族的行為高度抽象,添加一個(gè)產(chǎn)品線的邏輯比較清晰。

  缺點(diǎn):當(dāng)我們對(duì)產(chǎn)品線上的產(chǎn)品進(jìn)行增加和刪除時(shí),對(duì)應(yīng)的操作比較麻煩,所有的產(chǎn)品工廠都需要進(jìn)行修改。

  4)單例,這是比較好理解的一個(gè)模式,從字面上說,就是程序在運(yùn)行的過程中,希望在任意時(shí)刻,都只保留某個(gè)對(duì)象的唯一實(shí)例。對(duì)應(yīng)的UML結(jié)構(gòu)圖如下:

  

  單例的實(shí)現(xiàn)方式一般包括幾步:1)私有的指向自身的字段;2)私有構(gòu)造函數(shù);3)公開對(duì)私有字段進(jìn)行實(shí)例化的方法。也有幾種針對(duì)具體語言進(jìn)行的改善,例如針對(duì)多線程采用double lock機(jī)制,采用常量方式定義私有字段、使用內(nèi)嵌類來實(shí)例化字段等。

  我們也可以對(duì)單例進(jìn)行一些適當(dāng)?shù)臄U(kuò)展,例如我們將對(duì)象的個(gè)數(shù)由1個(gè)變?yōu)镹個(gè),這就成了對(duì)象池。

  通常工廠模式中會(huì)使用到單例模式,特別是對(duì)于簡(jiǎn)單工廠來說。

  5)構(gòu)造者,對(duì)于一些復(fù)雜對(duì)象來說,它可以分成多個(gè)不同的部分,在實(shí)例化時(shí),不同部分之間實(shí)例化的順序,有時(shí)會(huì)有嚴(yán)格的限制,這時(shí)我們就可以使用構(gòu)造者模式了。對(duì)應(yīng)的UML結(jié)構(gòu)圖如下:

  

  我們定義了IBuilder接口來實(shí)例化對(duì)應(yīng)的不同部分,同時(shí)有一個(gè)方法來返回對(duì)象的實(shí)例。而Constructor類的Construct方法會(huì)按照業(yè)務(wù)邏輯依次調(diào)用實(shí)例化部分對(duì)象的方法,即BuildPartA、BuildPartB,這里的調(diào)用順序,完全由業(yè)務(wù)邏輯來控制,最后可以調(diào)用GetProduct方法取得完整的對(duì)象實(shí)例。

  我們有時(shí)也會(huì)對(duì)上圖進(jìn)行修改,例如將GetProduct放到Constructor中,或者將Construct方法放入到GetProduct(取消Constructor)中。即使有這些變形,但是基本的思想是不變的。

  6)原型,我們?cè)诔绦蜻\(yùn)行過程中,當(dāng)需要有新的實(shí)例對(duì)象時(shí),有時(shí)并不希望是從頭創(chuàng)建一個(gè)對(duì)象,而是希望新的實(shí)例的狀態(tài)和某個(gè)已存在的實(shí)例保持一致,這就是原型模式發(fā)揮作用的地方。對(duì)應(yīng)的UML結(jié)構(gòu)圖如下:

  

  在.NET中,已經(jīng)定義了IClonable接口來實(shí)現(xiàn)原型模式。需要注意在實(shí)現(xiàn)時(shí),會(huì)有深拷貝和淺拷貝的區(qū)別,深拷貝會(huì)同時(shí)拷貝堆棧和堆上的內(nèi)容,而淺拷貝只會(huì)拷貝堆棧上的內(nèi)容。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多