設計模式|創建型模式

目錄

前言

讀懂UML圖

設計模式六大原則

設計模式分類

創建型模式原則

創建型模式 分析

1.簡單工廠模式

2.工廠方法模式

3.抽象工廠方法模式

4.建造者模式

5.單例模式

6.原型模式

創建型模式 總結


前言

設計模式是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結,設計模式不是具體的代碼,而是一種合理、易拓展、易維護的代碼架構思想。設計模式被運用在各種優秀的框架中。掌握設計模式不僅能幫助我們更好的理解開源框架、亦能提升我們的編程能力。本文旨在總結常用設計模式的原理和常用場景。寫作水平有限,不恰當處請指出。

讀懂UML圖

  • 繼承(extends):帶三角箭頭的實線,箭頭指向父類
  • 實現關係(implements):帶三角箭頭的虛線,箭頭指向接口
  • 依賴:帶箭頭的虛線,指向被使用者
  • 關聯 :帶普通箭頭的實心線,指向被擁有者
  • 聚合:帶空心菱形的實心線,菱形指向整體
  • 組合:帶實心菱形的實線,菱形指向整體

設計模式六大原則

  • 單一職責原則(SRP):單個類只負責一項業務
  • 里氏替換原則:子類功能要多於父類功能,但是不要修改父類功能,以免引起調用歧義
  • 依賴倒置原則(面向接口編程):調用接口時注入接口而不是具體實現
  • 接口隔離原則:接口功能粒度要細,不要把所有的聲明放到一個接口,利用java單繼承多實現,分成多個接口
  • 迪米特法則:不要引入無法管理的類,引入類要以成員變量形式。又稱最少知道原則
  • 開閉原則:對擴展開發,對修改關閉

設計模式分類

創建型模式,共五種:單例模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式。

結構型模式,共七種:適配器模式、裝飾者模式、代理模式、門面模式(外觀模式)、橋樑模式、組合模式、享元模式。

行爲型模式,共十一種:策略模式、模版方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

創建型模式原則

創建型模式包括簡單工廠模式、工廠方法模式、抽象工廠模式、建造者模式、單例模式,創建型模式模式遵循的設計原則如下:

  • 解耦:把對象的創建和使用分離開
  • 單一職責:工廠負責對象的創建和實例化,對於使用者來說創建過程是黑盒的
  • 面向接口編程:使用者通過接口獲取對象,易於分工、維護

創建型模式 分析

1.簡單工廠模式

  • 說明:我們把被創建的對象稱爲“產品”,把創建產品的對象稱爲“工廠”。如果要創建的產品不多,只要一個工廠類就可以完成,這種模式叫“簡單工廠模式”。簡單工廠模式屬於不屬於23種設計模式,它是工廠模式在簡單場景下的一種應用。它的缺點是增加新產品時會違背“開閉原則”。
  • 適用場景:簡單工廠模式適用於產品(子類)較少的場景,例如圖書館管理系統中的用戶類,它的實現類很固定,只有學生、教職工兩種類型,在設計之初就可預見所有的類型,拓展的可能性很小,這種場景下適合使用簡單工廠模式。
  • 缺點:不滿足開閉原則,難拓展
  • UML解讀:product可以理解爲圖書館用戶類,ConcreateProduct1爲學生類,ConcreateProduct2爲教職工類,Factory爲工廠,Client爲使用用戶類的業務。Client想要建一個學生類或者教職工,只要調用工廠方法並且傳入對應類型,工廠方法便會返回相應類型。

2.工廠方法模式

  •  說明:工廠方法模式是對簡單工廠模式的進一步抽象化,工廠方法模式滿足開閉原則,可以更好的支持更好的支持多種產品(子類)、常擴展產品的業務場景。
  • 使用場景:車輛售後維修系統的零件模塊可以使用工廠方法模式,售後的零件是一個很靈活的業務場景,零件可以分爲普通單個維修零件、套項零件(例如維修大燈總成的多個零件組合成的零件組)、技術升級零件(檢查車輛可能存在的問題)。隨着業務拓展會有更多的零件類型產生,如果使用簡單工廠模式在新增了零件類型後就要修改原有代碼適應新場景,修改同時可能會引入錯誤,不滿足開閉原則。
  • 缺點:每增加一個產品就要增加一個具體產品類和一個對應的具體工廠類,這增加了系統的複雜度。
  • UML解讀:product1、product2爲不同的零件類型,Factory1、Factory2爲對應類型的工廠,它們都實現了AbStractFactory,Client爲零件類的使用者。如果想要創建一個A零件就找A零件的工廠方法,如果想拓展一個新的零件類型就新增一個零件工廠和零件實體,這樣就不會對老代碼產生影響。

3.抽象工廠方法模式

  •  說明:工廠方法模式是工廠和商品一對一的模式,抽象工廠方法模式可以理解爲一個工廠對一系列商品的情況。
  • 使用場景:永輝超市要選擇奶類食品供應商,採購的商品包括牛奶和酸奶,供應商包括蒙牛和伊利。蒙牛和伊利都是抽象工廠,因爲它們都有生成系列產品的能力。
  • 其缺點是:當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。
  • UML解讀:factory1和factory2分別代表蒙牛和伊利,product1*代表牛奶,product1*代表酸奶。

4.建造者模式

  • 說明:建造者模式適用於整體對象由多個部件組成,且多個部件可以獨立存在的情況,產品的組成部分是不變的,但每一部分是可以靈活選擇的。
  • 場景:組裝汽車時需要用到發動機、車架、郵箱等零部件,零部件的生產相互獨立,爲汽車總成提供零件供應。在組裝汽車時按照一定的順序對零部件進行安裝、調試,最終完成汽車的組裝。汽車的最終組裝者類似於電影導演的角色。
  • UML解讀:Client是調用發起者,可以看作是外部觸點,Director是導演類負責執行汽車的組裝.BMBuilder和BenZBuilder實現了CarBuilder,CarModel 以及兩個實現類 BenzModel 和 BMWModel 叫做產品類(Product Class),這個產品類實現了模板方法模式。
    CarBuilder 以及兩個實現類 BenzBuilder 和 BMWBuilder 叫做建造者(Builder Class)。

5.單例模式

  • 說明:保證一個類只有一個實例,並提供一個全局訪問點
  • 場景:數據庫連接池的設計、
  • 優點:在內存中只有一個實例,減少內存開銷、全局統一的訪問點可以嚴格控制對象的訪問
  • 缺點:沒有接口,擴展困難
  • UML圖:客戶端訪問單例類,單例類負責控制任何情況下只有一個實例

 

單例模式學習友情鏈接:

單例模式的懶漢式爲什麼是線程不安全的,懶漢式如何實現線程安全

序列化、反序列化對單例的破壞、原因分析、解決方案及解析

6.原型模式

  • 說明:原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象
  • 特點:不需要知道任何創建的細節,不調用構造函數
  • 場景:類初始化效果過多資源、new產生的一個對象需要非常繁瑣的過程(數據準備、訪問權限控制)、構造函數比較複雜、循環體中產生大量的對象。
  • 優點:使用原型模式創建對象比直接new對象的性能高、簡化創建過程
  • 缺點:必須配備克隆方法、克隆複雜對象或克隆出的對象進行復雜性改造時容易引入風險、對複雜對象深拷貝、淺拷貝要運用得當
  • 擴展:深克隆、淺克隆區別與使用

原型模式學習友情鏈接:

原型模式的使用案例、克隆複合對象出現的問題及解決方案、深克隆和淺克隆的區別

創建型模式 總結

  • 簡單工廠方法:把所有對象的創建,集中到一個類中處理
  • 工廠方法模式:一個工廠負責一個產品的創建
  • 抽象工廠模式:將一系列的產品抽象到同一個工廠創建
  • 建造者模式:對象的創建比較複雜時,按照步驟一塊塊創建,讓創建過程模板化
  • 單例模式:控制實例數量,確保一個類只有一個實例
  • 原型模式:用於低消耗的創建對象

圖片、部分文字出處如下(侵刪):

C語言中文網《設計模式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章