天天看點

設計模式舉例-建立型

幾個工廠模式的差異

建立型設計模式都多個,其中幾個很容易搞混,Factory Method(工廠模式),Abstract Factory(抽象工廠模式)和Builder(建造者模式),但實際上這3個使用場景是不同的。工廠模式應用的最多,都是一些簡單的對象構件場景;抽象工廠應用于複雜的建構場景,而且工廠和産品都需要實作擴充;建造者關鍵場景是需要進行很多元件的裝配,實際場景下,可能會和抽象工廠模式一起混合使用。應用這幾個模式的原則是,如果能夠使用工廠模式完成,就不要使用後面兩種,否則就是殺雞用了牛刀。

Singleton(單例模式):運作環境中隻建立一個,可以友善的進行全局通路,為了避免多線程問題,最好對象裡面存放的都是隻讀資料,這樣在程式一開始,隻有主線程運作的時候就完成初始化,避免初始化過程中線程競争問題。單例模式實作的方式有很多種,可以網上查詢一下具體的實作方式,對比它們的優缺點,最好的單例模式實作不應該使用鎖,鎖會降低并發性能。應用場景全局:安卓的Application(單例對象),在該類的onCreate()方法可以初始化自己的全局緩存對象(單例對象),Activity之間通過全局緩存傳遞複雜資料,intent的隻傳遞key值,這樣可以減少資料的序列化和反序列化帶來的性能消耗。

Prototype(原型模式):使用對象克隆一個新的對象,使用場景:單據的備份儲存,原單和備份單有相同的資料結構,使用原單對象克隆一個備份單對象,具體的實作就是BEAN對象的拷貝和指派,可以通過JAVA的反射原理在單據的基類當中實作,這樣可以大大減少代碼的開發量。

Factory Method(工廠模式):細分為兩種,一個是簡單工廠;一個是使用抽象方法,讓子類決定生産什麼對象。簡單工廠運用場景:資料庫Facade的建立,網絡層Facade的建立,如下圖,使用DataSourceFactory建立IDataSourceManager,通過傳入的連接配接參數決定建立本地實作還是遠端實作。

設計模式舉例-建立型

第二種方式适合建立更加複雜的場景,例如:單據GUI基類建立對應的單據實體類,因為基類是不知道建立什麼單據實體類的,建立決定權交給了下面的GUI的子類。下面的圖檔案例裡面,子類需要在構造函數裡面設定單據對象m_orderClass來告知父類建立什麼單據。

設計模式舉例-建立型

Abstract Factory(抽象工廠模式):抽象工廠用來處理比工廠模式更加複雜的對象構件場景,可以實作産品和工廠的獨立演化,類圖結構上有些類似橋接模式,當然應用的目的和場景都不同,下面是抽象工廠的類圖結構:

設計模式舉例-建立型

應用抽象工廠模式的關鍵是抽象工廠類和抽象産品類的設計,設計過程考驗着設計者的抽象歸納思維能力,比如這個UML工具的圖形對象的抽象設計,每個圖形對象都需要知道怎麼繪制自己,抽象出函數paint(),都應該知道怎麼計算自己尺寸,抽象出computeSize(),這個抽象過程也是一個不斷完善的過程。

Builder(建造者模式):建造者模式也是應用于複雜的建立場景,和抽象工廠的差別就是,建造者模式有個Director來負責各個零件的裝配,例如,在UML工具的例子當中,圖形面闆的建立就可以使用建造者,建造者的director負責把多個圖形在面闆上根據位置裝配起來,形成一個整體的圖形面闆。

繼續閱讀