1. 程式人生 > >《大話設計模式》筆記(1)——創建型模式

《大話設計模式》筆記(1)——創建型模式

原型模式 優點 sta oracle數據 () 生成器模式 ret singleton 生成器

1、簡單工廠模式/靜態工廠方法

  定義:簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。

  UML:

技術分享圖片

  PS這個設計模式太簡單了,沒什麽好解說的,簡單來說就是通過傳入一個標識到工廠類方法中,返回相應的具體產品。

2、工廠方法模式

  定義:定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使得一個類的實例化延遲到其子類。

  UML:

技術分享圖片

  PS:簡單工廠模式的優點在於工廠類中包含了必要的邏輯判斷,根據客戶端傳入的標識來動態實例化相應的類。

    工廠方法模式是把簡單工廠的內部邏輯判斷,移到了客戶端進行,由客戶端調用具體的工廠類ConcreteFactory去生成相應的具體產品ConcreteProduct。如上面UML中所示,每一種產品都有相應的工廠類ConcreteFactory,有多少種產品就有多少個工廠類ConcreteFactory。

3、抽象工廠模式(Abstract Factory)

  定義:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

  UML:

技術分享圖片

  PS:比如我們的系統需要同時支持Oracle和MSSql,那我們可以把上面UML中的ProductA1看做是對Oracle數據庫的操作,ProductA2看做是對MSSql數據庫的操作,這時使用抽象工廠模式的好處時,如果哪天需要把MSSql數據庫切換成Oracle數據庫時,就只需要更改使用到ConcreteFactory的地方就可以。此模式主要利用的就是面向接口編程的優點。該模式可以配合簡單工廠模式,或用反射+配置文件的方式來進一步優化。

4、建造者模式(Builder)

  定義:建造者模式又稱生成器模式,它將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

  UML:

技術分享圖片

  PS:具體建造者類ConcreteBuilder.BuildPart()只建造成品的特定組件,ConcreteBuilder中可能有多個BuildPart()去建造各種組件,然後具體成品的組裝則由Director來完成。我第一反應是覺得Director完全沒有存在的必要,直接都由建造者來完成就可以了,但再想想時覺得,這也許就是減耦建造組件和組裝組件的耦合。至於是把代碼放在同一個類中或多個類中不一定就對模式有破壞性。

  參考代碼:

技術分享圖片

技術分享圖片

  應用場景類比:建造胖瘦小人

5、原型模式(Prototype)

  定義:用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。

  UML:

技術分享圖片

  PS:原型類中定義一個方法來克隆自身,可以實現ICloneable接口來完成原型模式。

  應用場景類比:簡歷復制

6、單例模式(Singleton)

  定義:保證一個類只有一個實例,並提供一個訪問它的全局訪問點。

  UML:

技術分享圖片

  PS:單例模式應該是平時應用比較多的一種模式,該模式主要在於把構造函數設置為私有,並提供一個可供全局訪問的點。雖然說常用,但還是有兩點值得一提的。一是單例類聲明為sealed,以防止派生增加實例的風險,二是多線程中使用時要雙重鎖定。這種實現方式是我之前常用,這種方式被稱為賴漢式單例類,因為它只有第一次被引用時,才取實例化。另外還有一種餓漢式單例類,它是把instance設置為靜態,並在聲明賦值時實例化,這種”靜態初始化“方法就不需要考慮多線程的問題。這兩種方式各有利弊吧,看實際需求取舍吧。

《大話設計模式》筆記(1)——創建型模式