本文介紹5種常見建立型設計模式(Creational Patterns)以及對應UML。同時,本文轉載了Java和Python的代碼實現。值得注意的是,Java是靜態語言(強類型語言),變量必須聲明數據類型;而Python是動態語言(弱類型語言),變量使用以前不須要類型聲明,一般變量的類型是被賦值的那個值的類型。所以,在design pattern代碼實現上,會有顯著差異。(有些動態語言,好比Python,已經把設計模式作成了語言特性???)java
爲什麼大量設計模式在動態語言中不適用? - 知乎
https://www.zhihu.com/questio...
UML繪製工具:ProcessOn
Git Book:設計模式Java版python
定義一個用於建立對象(Product)的接口(Factory),讓子類(ConcreteFactory)決定將哪個類(ConcreteProduct)實例化git
代碼實現:Java,Python
(注:Python代碼充分利用了dict數據結構的特性,因此,代碼上與Java略有不一樣)github
工廠方法模式存在着一個問題,該模式中的每一個工廠都只生產一種產品,勢必致使大量工廠的存在。由此,咱們須要考慮將同一類產品組成「產品族」,用同一個工廠來統一輩子產,即抽象工廠。設計模式
抽象工廠使一個工廠能生產多個產品。抽象工廠是全部具體工廠的抽象。安全
(畫完這個UML圖,因此我感受抽象工廠模式,其實就是讓工廠多加幾個工廠方法,來生產多個產品???)數據結構
能夠發現抽象工廠是有缺陷,批量增長工廠來生產不一樣產品族(即,一個 (ProductA, productB) 元組)是方便的,可是要改變產品結構,即增長 ProductC 就必須修改抽象工廠。多線程
最後,感謝知友ichennan對工廠模式的終極總結:工具
抽象工廠模式和工廠模式的區別? - 名姓的回答 - 知乎
https://www.zhihu.com/questio...
只容許類的對象被實例化一次。一般用於全局變量。單例模式建立的對象,能夠用做共享信息的存放。
單例模式有三個要點:一是某個類只能有一個實例;二是它必須自行建立這個實例;三是它必須自行向整個系統提供這個實例。
進一步地,爲避免多線程環境下,多個線程同時調用getInstance方法建立實例,引入 餓漢式單例類 和 懶漢式單例類 兩種解決辦法。前者,在定義靜態變量的時候就實例化單例類,所以在類加載的時候就已經建立了單例對象;後者,使用關鍵字synchronized來避免多線程同時調用getInstance方法。兩種模式各自存在缺點,終極解決辦法是:Initialization-on-demand Holder(idiom)技術,由Java虛擬機來保證線程安全性。