java設計模式分析之工廠、享元、建造者、原型模式

一個優秀的開源框架中往往會體現出很多Java設計模式的影子,瞭解設計模式有助於理解開源框架中的程序設計之美接下來我會將自己整理的對一些設計模式的理解記錄在這裏

這個系列我會盡量將設計模式中比較容易混淆的概念統一起來進行分析和比較,

而一些比較簡單的模式例如單例模式,會直接忽略

文章中設計一些個人的理解如有偏差,敬請指正

若您對我的分享感興趣可以訪問:java設計模式專欄

本篇記錄:工廠模式、  抽象工廠模式、享元模式、建造者模式、原型模式

1、工廠模式

工廠模式的描述是:你只需要關心一個產品的結果而不需要關心這個產品是如何生產出來的,例如你可能需要一輛奔馳或者一輛寶馬,你不需要知道工廠是如何生產出來的,你只需要得到一個結果,寶馬或者奔馳就可以了
用來替代什麼?

工廠模式用來替代創建實例對象的new

爲什麼需要?
可能你會有疑問既然是用來替代new,那麼爲什麼不直接new出來呢?好像使用工廠模式代碼量也增加了

問題在於如果是一個簡單的new操作我們直接new沒有什麼疑問,但是如果在我們new一個對象的時候需要進行一些初始化操作,例如比如賦值,比如查詢數據庫等,此時如果我們應用裏面多處需要此對象,就會產生多處的代碼拷貝或者重複工作,不切也不利於將來的代碼維護,使用工廠模式就可以完美解決這些問題

工廠模型的必備:
(1)父類,即工廠所有產品的父類
(2)使用工廠類根據條件負責生產所有產品
使用反射和泛型可以不用每增加一個對象都需要實現在工廠裏面增加一條產品線,但是這樣只能實現簡單的new 而不能呢個實現複雜的生產對象的功能
應用場景:
例如:我們請求支付的時候可能需要有幾種支付模式:微信,支付寶,零錢,可以使用工廠類來生產這幾個數據bean

具體的應用:調用支付接口需要使用工廠創建支付Bean,PayFactrory

 

2、抽象工廠模式
抽象工廠模式是一種類似於超級工廠的實現
這種超級工廠可以用來生產其他的低級工廠,這些低級工廠用來生產相同系列的商品
因此使用超級工廠模式可以用來直接生產出一系列的產品

 

 

例如:QQ的換皮膚

每一套不同風格的皮膚都是由一個低級工廠產出的,而這些低級工廠又是被超級工廠生產出來的
於是我們可以直接使用超級工廠來生產皮膚工廠,然後使用皮膚工廠來生產整套皮膚

 

 

3、享元模式

簡單的理解享元模式其實就是應用緩存的概念

介紹:

享元模式(Flyweight Pattern)主要用於減少創建對象的數量,以減少內存佔用和提高性能,享元模式嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象

如何解決:

用唯一標識碼判斷,如果在內存中有,則返回這個唯一標識碼所標識的對象。

關鍵代碼:

用 HashMap 存儲這些對象。

優點:大大減少對象的創建,降低系統的內存,使效率提高。

缺點:提高了系統的複雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質,不應該隨着內部狀態的變化而變化,否則會造成系統的混亂

注意事項:

 1、注意劃分外部狀態和內部狀態,否則可能會引起線程安全問題

 2、這些類必須有一個工廠對象加以控制

應用實例:

 1、JAVA 中的 String,如果有則返回,如果沒有則創建一個字符串保存在字符串緩存池裏面。 2、數據庫的數據池。

可能看到上面有些人會疑惑什麼是外部狀態,什麼是內部狀態?

我們舉一個例子:

    如果我們需要開發一款圍棋軟件,我們可以發現圍棋的棋子應該是可以用享元模式來進行緩存,但是對圍棋棋子進行進一步分析發現雖然黑色棋子和白色棋子可以共享,但是它們將顯示在棋盤的不同位置,如何讓相同的黑子或者白子能夠多次重複顯示且位於一個棋盤的不同地方?

解決方法就是將棋子的位置定義爲棋子的一個外部狀態,在需要時再進行設置

我們可以把外部狀態定義成一個位置類,用來描述棋子的位置因素

也就是說我們將除去位置因素之後的棋子變成一個共享的對象,可以使用緩存,當需要使用到位置因素的時候,使用不同的位置對象進行表徵

4、建造者模式
建造者模式可以用來生產更復雜的產品,但是整個構建過程是相似的,因此我們可以使用相同的構建過程來創建不同的表示,例如下圖:我們構建一個快餐套裝的過程
建造者模式和工廠模式的區別是:建造者模式更加關注於零件裝配的順序



5、原型模式
這種模式是用於當創建一個新的對象需要付出較大的代價的時候,使用原型模式可以根據原有對象克隆出一個新的對象
通過對一個類進行實例化來構造新對象不同的是,原型模式是通過拷貝一個現有對象生成新對象的。淺拷貝實現 Cloneable,重寫,深拷貝是通過實現 Serializable 讀取二進制流。
原型模式使用起來比較簡單,就是根據java提供的clone方法,來對原有對象進行復制,主要需要考慮的點有:如何進行深層次的克隆,在什麼場景下需要進行克隆

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