建立型模式列表
abstract factory
creates an instance of several families of classes
builder
separates object construction from its representation
factory method
creates an instance of several derived classes
prototype
a fully initialized instance to be copied or cloned
singleton
a class of which only a single instance can exist
建立型模式,就是用來建立物件的模式,抽象了例項化的過程。它幫助乙個系**立於如何建立、組合和表示它的那些物件。本文主要對前面幾章五種常用建立型模式進行了比較,通過乙個遊戲開發場景的例子來說該如何使用建立型模式。
一、為什麼需要建立型模式
所有的建立型模式都有兩個永恆的主旋律:第一,它們都將系統使用哪些具體類的資訊封裝起來;第二,它們隱藏了這些類的例項是如何被建立和組織的。外界對於這些物件只知道它們共同的介面,而不清楚其具體的實現細節。正因如此,建立型模式在建立什麼(what),由誰(who)來建立,以及何時(when)建立這些方面,都為軟體設計者提供了盡可能大的靈活性。
假定在乙個遊戲開發場景中,會用到乙個現代風格房屋的物件,按照我們的一般想法,既然需要物件就建立乙個:
modernroom room = new modernroom();
好了,現在現代風格房屋的物件已經有了,如果這時房屋的風格變化了,需要的是古典風格的房屋,修改一下:
classicalroom room = new classicalroom();
試想一下,在我們的程式中有多少處地方用到了這樣的建立邏輯,而這裡僅僅是房屋的風格變化了,就需要修改程式中所有的這樣的語句。現在我們封裝物件建立的邏輯,把物件的建立放在乙個工廠方法中:
modernfactory factory = new modernfactory();
modernroom room = factory.create();
當房屋的風格變化時,只需要修改
classicalfactory factory = new classicalfactory();
classicalroom room = factory.create();
而其它的用到room的地方仍然不變。這就是為什麼需要建立型模式了。建立者模式作用可以概括為如下兩點:
1.封裝建立邏輯,絕不僅僅是new乙個物件那麼簡單。
2.封裝建立邏輯變化,客戶**盡量不修改,或盡量少修改。
二、常見的五種建立型模式
單件模式(singleton pattern)解決的是實體物件的個數問題,其他的都是解決new所帶來的耦合關係問題。
工廠方法模式(factory pattern)在工廠方法中,工廠類成為了抽象類,其實際的建立工作將由其具體子類來完成。工廠方法的用意是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類中去,強調的是「單個物件」的變化。
抽象工廠模式(abstract factory)抽象工廠是所有工廠模式中最為抽象和最具有一般性的一種形態。抽象工廠可以向客戶提供乙個介面,使得客戶可以在不必指定產品的具體型別的情況下,建立多個產品族中的產品物件,強調的是「系列物件」的變化。
生成器模式(builder pattern)把構造物件例項的邏輯移到了類的外部,在這個類的外部定義了這個類的構造邏輯。他把乙個複雜物件的構造過程從物件的表示中分離出來。其直接效果是將乙個複雜的物件簡化為乙個比較簡單的目標物件。他強調的是產品的構造過程。
原型模式(prototype pattern)和工廠模式一樣,同樣對客戶隱藏了物件建立工作,但是,與通過對乙個類進行例項化來構造新物件不同的是,原型模式是通過拷貝乙個現有物件生成新物件的。
三、如何選擇使用建立型模式
繼續考慮上面提到的遊戲開發場景,假定在這個遊戲場景中我們使用到的有牆(wall),屋子(room),門(door)幾個部件。在這個過程中,同樣是物件的建立問題,但是會根據所要解決的問題不同而使用不同的建立型模式。
如果在遊戲中,乙個屋子只允許有乙個門存在,那麼這就是乙個使用signleton模式的例子,確保只有乙個door類的例項被建立。解決的是物件建立個數的問題。
示例**:
在遊戲中需要建立牆,屋子的例項時,為了避免直接對構造器的呼叫而例項化類,這時就是工廠方法模式了,每乙個部件都有它自己的工廠類。解決的是「單個物件」的需求變化問題。
示例**:
在遊戲場景中,不可能只有一種牆或屋子,有可能有現代風格(modern),古典風格(classical)等多系列風格的部件。這時就是一系列物件的建立問題了,是乙個抽象工廠的例子。解決的是「系列物件」的需求變化問題。
示例**:
如果在遊戲場景中,構成某乙個場景的演算法比較穩定,例如:這個場景就是用四堵牆,乙個屋子,一扇門來構成的,但具體是用什麼風格的牆、屋子和門則是不停的變化的,這就是乙個生成器模式的例子。解決的是「物件部分」的需求變化問題。
示例**:
如果在遊戲中,需要大量的古典風格或現代風格的牆或屋子,這時可以通過拷貝乙個已有的原型物件來生成新物件,就是乙個原型模式的例子了。通過轉殖來解決「易變物件」的建立問題。
示例**:
究竟選用哪一種模式最好取決於很多的因素。使用abstract factory、prototype pattern或builder pattern的設計比使用factory method的設計更加靈活,但是也更加複雜,尤其abstract factory需要龐大的工廠類來支援。通常,設計以使用factory method開始,並且當設計者發現需要更大的靈活性時,設計便會向其他設計模式演化,當你在多個設計模式之間進行權衡的時候,了解多個設計模式可以給你提供更多的選擇餘地。
1、建立型模式專題總結:http://hi.baidu.com/nana****ou/blog/item/42d96fcf29aa913bf9dc6133.html
2、建立型模式:http://blog.163.com/jinsir@yeah/blog/static/105444059200902112958170/
3、建立型模式之間的比較:http://blog.donews.com/godwood/archive/2006/01/18/699647.aspx
建立型模式總結
1.簡單工廠模式.定義 簡單工廠模式 factory 又稱靜態工廠方法模式 static factory method 它專門定義乙個類來負責建立其它類的例項,被建立的類通常有相同的父類.應用場景 1.工廠類負責建立的對像型別比較少.2.客戶只知道傳入工廠類的引數,對於如何建立對像的 邏輯 不關心....
建立型模式總結
建立型模式有四種 factorymethod abstractfactory builder prototype 再具體劃分一些 1.通過生成物件類的子類的方法建立物件 factorymethod,2.定義乙個物件負責明確產品物件類,並將它作為該系統的引數 abstractfactory build...
建立型模式總結
abstractfactory和builder都是建立乙個組合物件,讓組合物件可以有不同的表示,區別在於建立組合物件過程的複雜度。當只是簡單的組合時,用abstractfactory 當是乙個複雜的組合時,用builder 總結成三個字 複雜度。factorymethod和prototype都是建立...