設計模式-建立型

alloc發表於2018-01-01

一、簡單工廠(Simple Factory)

1、定義

提供一個建立物件例項的功能,而無需關心其具體的實現。被建立的例項型別可以是介面、抽象類,也可以是具體的類。

2、類圖

類圖

  • Api:定義客戶所需要的功能介面
  • Impl:具體實現Api的實現類,可能會有多個
  • Factory:工廠,選擇合適的實現類來建立Api介面物件
  • Client:客戶端,通過Factory去獲取Api介面物件,然後面向Api介面程式設計

3、呼叫順序

呼叫順序

4、示例程式碼

建立介面

設計模式-建立型
實現
設計模式-建立型
工廠類
設計模式-建立型
客戶端
設計模式-建立型

5、何時選用簡單工廠

1、如果想要完全封裝隔離具體實現,讓外部只能通過介面來操作封裝體

2、如果想要把對外建立物件的職責集中管理和控制

二、工廠方法(Factory Method)

1、定義

定義一個用於建立物件的介面,讓子類決定例項化哪一個類,使一個類的例項化延遲到其子類

2、類圖

設計模式-建立型

  • Product:定義工廠方法所建立的物件的介面,也就是實際需要使用的物件的介面。
  • ConcreteProduct:具體的Product介面的實現物件。
  • Creator:建立器,宣告工廠方法,工廠方法通常會返回一個Product型別的例項物件,而且多是抽象方法。也可以在Creator裡面提供工廠方法的預設實現,讓工廠方法返回一個預設的Product型別的例項物件。
  • ConcreteCreator:具體的建立器物件,覆蓋實現Creator定義的工廠方法,返回具體的Product例項。

3、呼叫順序

設計模式-建立型

4、示例程式碼

物件介面

設計模式-建立型
具體物件
設計模式-建立型
建立器
設計模式-建立型
具體建立器
設計模式-建立型

5、何時選用工廠方法模式

1、如果一個類需要建立某個介面的物件,但是又不知道具體的實現

2、如果一個類本身就希望,由它的子類來建立所需的物件的時候

三、抽象工廠(Abstract Factory)

1、定義

提供一個建立一系列相關或相互依賴物件的介面,而無需指定他們的具體類

2、類圖

設計模式-建立型

  • AbstractFactory:抽象工廠,定義建立一系列產品物件的操作介面。
  • ConcreteFactory:具體的工廠,實現抽象工廠定義的方法,具體實現一系列產品物件的建立。
  • AbstractProduct:定義一類產品物件的介面。
  • ConcreteProduct:具體的產品實現物件,通常在具體工廠裡面,會選擇具體的產品實現物件,來建立符合抽象工廠定義的方法返回的產品型別的物件。
  • Client:客戶端,主要使用抽象工廠來獲取一系列所需要的產品物件,然後面向這些產品物件的介面程式設計,以實現需要的功能。

3、呼叫順序

設計模式-建立型

4、示例程式碼

抽象共工廠介面

設計模式-建立型
抽象產品介面
設計模式-建立型
產品具體實現
設計模式-建立型
具體工廠實現
設計模式-建立型
客戶端
設計模式-建立型

5、何時選用抽象工廠模式

1、如果希望一個系統獨立於它的產品的建立,組合和表示的時候,換句話說,希望一個系統只是知道產品的介面,而不關心實現的時候。

2、如果一個系統要由多個產品系列中的一個來配置的時候,換句話說,就是可以動態的切換產品簇的時候。

3、如果要強調一系列相關產品的介面,以便聯合使用它們的時候。

四、單例 (Singleton)

1、定義

保證一個類僅有一個例項,並提供一個全域性訪問點

2、類圖

設計模式-建立型

3、呼叫順序

設計模式-建立型
設計模式-建立型

4、示例程式碼

設計模式-建立型
設計模式-建立型

5、何時選用單例模式

當需要控制一個類的例項只能有一個,而且客戶只能從一個全域性訪問點訪問它時,可以選用單例模式,這些功能恰好是單例模式要解決的問題。

五、生成器(Builder)

1、定義

將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表現。

2、類圖

設計模式-建立型

  • Builder:生成器介面,定義建立一個Product物件所需的各個部件的操作。
  • ConcreteBuilder:具體的生成器實現,實現各個部件的建立,並負責組裝Product物件的各個部件,同時還提供一個讓使用者獲取組裝完成後的產品物件的方法。
  • Director:指導者,也被稱為導向者,主要用來使用Builder介面,以一個統一的過程來構建所需要的Product物件。
  • Product:產品,表示被生成器構建的複雜物件,包含多個部件。

3、呼叫順序

設計模式-建立型

4、示例程式碼

生成器介面

設計模式-建立型
具體生成器實現物件
設計模式-建立型
產品
設計模式-建立型
指導者
設計模式-建立型

5、何時選用生成器模式

1、如果建立物件的演算法,應該獨立於該物件的組成部分以及它們的裝配方式時

2、如果同一個構建過程有著不同的表示時

六、原型模式(Prototype)

1、定義

用原型例項指定建立物件的種類,並通過拷貝這些原型實現建立新的物件。

2、類圖

設計模式-建立型

  • Prototype:宣告一個克隆自身的介面,用來約束想要克隆自己的類,要求它們都要實現這裡定義的克隆方法。
  • ConcretePrototype:實現Prototype介面的類,這些類真正實現了克隆自身的功能。
  • Client:使用原型的客戶端,首先要獲取到原型例項物件,然後通過原型例項克隆自身來建立新的物件例項。

3、呼叫順序

設計模式-建立型

4、示例程式碼

克隆介面

設計模式-建立型
克隆的具體實現物件
設計模式-建立型
客戶端
設計模式-建立型

5、何時選用原型模式

1、如果一個系統想要獨立於它想要使用的物件時,可以使用原型模式,讓系統只面向介面程式設計,在系統需要新的物件的時候,可以通過克隆原型來得到

2、如果需要例項化的類是在執行時刻動態指定時,可以使用原型模式,通過克隆原型來得到需要的例項

6、淺度克隆和深度克隆

淺度克隆:只負責克隆按值傳遞的資料(比如:基本資料型別、String型別) 深度克隆:除了淺度克隆要克隆的值外,還負責克隆引用型別的資料,基本上就是被克隆例項所有的屬性的資料都會被克隆出來。 深度克隆還有一個特點,如果被克隆的物件裡面的屬性資料是引用型別,也就是屬性的型別也是物件,那麼需要一直遞迴的克隆下去

相關文章