注意單件模式在多線程的問題。
Abstract Factory抽象工廠:
例子:遊戲中不同系列的設施建立(古典的,現代的...),但是對於系列中的對象(道路,房屋...這些是不變的,不
會需要增加一個“下水道”對象)簡單工廠的問題:--不能應對“不同系列對象”的變化,有了新的變化點。一系列相互依賴的對象
抽象工廠的缺點:難以應對“新對象”的需求變動,它只適用於“新系列”的需求變動。Abstract Factory模式和Factory Method模式結合,來應對“對象建立”的需求變化
Builder產生:
例子:遊戲中造房子,房子的各個部分千變萬化,這樣就可以造出各種各樣的房子。
“一個複雜物件”的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜物件的
各個部分經常面臨著劇烈的變化,但是將他們組合在一起的演算法卻相對穩定。
意圖:將一個複雜物件的構建與其表示相分離,使得同樣的構建過程 可以建立 不同 的表示。
Builder模式主要在於應對“複雜物件各個部分”的頻繁需求變動,其缺點在於難以應付“構建演算法”的頻繁需求
變動。
Builder模式通常和Composite模式組合使用。
Factory MethodFactory 方法:
例子:造車,比如要造紅旗車,但是現在需求變了,需要造東風車。
“某個對象”的建立工作,由於需求的變化,這個對象經常面臨著劇烈的變化,但是它卻擁有比較穩定的介面
定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類,Factory Method使得一個類的執行個體化延遲到子類
Prototype原型:
例子:一個遊戲中需要多個Actor,這具體某個Actor可能會用到多個,所以採用“複製”,來建立多個具體的
Actor。
“某些結構複雜的對象”的建立工作,由於需求的變化,這些對象經常面臨著劇烈的變化,但是它們卻擁有比較穩
定一致的介面。使用原型執行個體指定建立對象的種類,然後通過拷貝這些原型來建立新的對象。
建立型模式總結:
Singleton解決的是實體物件個數的問題,除了Singleton之外,其他建立型模式解決的都是new所帶來的耦合關係
。
Factory 方法模式(Factory Pattern)的用意是定義一個建立產品對象的工廠介面,將實際建立工作延遲到子類中去
,強調的是“單個對象”的變化。
抽象原廠模式(Abstract Factory)抽象工廠是所有原廠模式中最為抽象和最具有一般性的一種形態。抽象工廠可以向客戶提供一個介面,使得客戶可以在不必指定產品的具體類型的情況下,建立多個產品族中的產品對象,強調的是“系列對象”的變化。
產生器模式(Builder Pattern)把構造對象執行個體的邏輯移到了類的外部,在這個類的外部定義了這個類的構造邏
輯。他把一個複雜物件的構造過程從對象的表示中分離出來。其直接效果是將一個複雜的對象簡化為一個比較簡單
的目標對象。他強調的是產品的構造過程。
原型模式(Prototype Pattern)和原廠模式一樣,同樣對客戶隱藏了對象建立工作,但是,與通過對一個類進行
執行個體化來構造新對象不同的是,原型模式是通過拷貝一個現有對象產生新對象的。
Factory Method,Abstract Factory,Builder都需要一個額外的工廠類來負責執行個體化“易變對象”,而
Prototype則是通過原型(一個特殊的工廠類)來複製“易變對象”。
如何選擇使用建立型模式
考慮遊戲開發情境,假定在這個遊戲情境中我們使用到的有牆(Wall),屋子(Room),門(Door)幾個組件。在這個過程中,同樣是對象的建立問題,但是會根據所要解決的問題不同而使用不同的建立型模式。
如果在遊戲中,一個屋子只允許有一個門存在,那麼這就是一個使用Signleton模式的例子,確保只有一個Door類
的執行個體被建立。解決的是對象建立個數的問題。
在遊戲中需要建立牆,屋子的執行個體時,為了避免直接對構造器的調用而執行個體化類,這時就是Factory 方法模式了,每一
個組件都有它自己的工廠類。解決的是“單個對象”的需求變化問題。
在遊戲情境中,不可能只有一種牆或屋子,有可能有現代風格(Modern),古典風格(Classical)等多系列風格
的組件。這時就是一系列對象的建立問題了,是一個抽象工廠的例子。解決的是“系列對象”的需求變化問題。
如果在遊戲情境中,構成某一個情境的演算法比較穩定,例如:這個情境就是用四堵牆,一個屋子,一扇門來構成的
,但具體是用什麼風格的牆、屋子和門則是不停的變化的,這就是一個產生器模式的例子。解決的是“對象部分”
的需求變化問題。
如果在遊戲中,需要大量的古典風格或現代風格的牆或屋子,這時可以通過拷貝一個已有的原型對象來產生新對象
,就是一個原型模式的例子了。通過複製來解決“易變對象”的建立問題。
如果遇到“易變類”,起初的設計通常從Factory Method開始,當遇到更多的複雜變化時,可以考慮重構為其他三
種原廠模式。