一、簡單工廠(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型別) 深度克隆:除了淺度克隆要克隆的值外,還負責克隆引用型別的資料,基本上就是被克隆例項所有的屬性的資料都會被克隆出來。 深度克隆還有一個特點,如果被克隆的物件裡面的屬性資料是引用型別,也就是屬性的型別也是物件,那麼需要一直遞迴的克隆下去