常用設計模式系列之——享元模式
Hello 大家好,我是鴨血粉絲,今天周六,你是在休息學習還是在加班呢?
今天阿粉要跟大家分享的是結構型模式之享元模式,既然享元模式是屬于結構性模式中的一種,那自然是用來組織代碼,調整相應的代碼結構來達到效果的,下面我們一起來看一下吧。
享元模式
首先常規操作,我們先看一下什么是享元模式,維基百科解釋:享元模式(英語:Flyweight Pattern)是一種軟件設計模式。它使用共享物件,用來盡可能減少內存使用量以及分享資訊給盡可能多的相似物件;它適合用于當大量物件只是重復因而導致無法令人接受的使用大量內存。通常物件中的部分狀態是可以分享。常見做法是把它們放在外部數據結構,當需要使用時再將它們傳遞給享元。
關鍵字:減少內存,共享物件,外部數據
簡單點描述一下就是一批對象中既有相同的內容也有不同的內容,相同的內容采用共享的方式,不同的內容通過動態傳遞的方式,來盡量減少對象的產生。這里需要理解的一點是,這多個對象其實底層對應的是同一個對象,物理地址是一個。
享元模式使用場景
享元模式的使用場景還是比較多的,最常見的一個場景就是 Java JDK 里面的 String 字符串類,因為 JVM 中有常量池,常量池的實現就是一種享元模式,避免多個相同對象的存在。另外線程池以及很多用到緩沖池的地方都采用了享元模式,比如 Integer 類中默認緩存了-128 -127 之間的整數,等等場景。
在演示享元模式之前,我們要先了解享元模式中涉及到的幾個角色名稱
- 抽象享元類:通常是一個接口,主要對外提供修改內部數據的接口
- 具體享元類:享元的實現類,通常存儲在內存中,便于使用
- 享元工廠類:對外創建具體享元類
下面我們通過一個簡單的示例來演示一下享元模式,我們創建一個接口類,然后寫一個實現類,再通過一個工廠來創建享元類,相關代碼如下:
UML 圖解
代碼演示
我們先創建一個接口類 IFlyweight.java,里面包含一個設置寬度的方法,如下
然后編寫一個實現類 FlyweightImpl.java 來實現接口,并且在構造函數中傳遞一個 Color 對象
第三步我們再編寫一個工廠類 FlyweightFactory.java,里面有一個 Color 對象的本地緩存,對于相同的顏色只保存一個對象。
顏色輔助類 Color.java
最后寫一個測試應用類 FlyweightDemo.java
上面測試類中,我們分別定義了兩種顏色的三個對象,由于相同顏色的對象已經被緩存了,所以我們輸出的結果如下:
輸出結果
“從上面的運行結果中,我們可以看出,flyweight0 與flyweight1 其實是同一個對象,雖然他們的 width 和 height 屬性值不一樣,但是他們的底層對應的是同一個對象本身。這就是享元模式的核心內容,通過共享變量,來減少對象的產生,從而減少內存的使用。
總結
今天跟大家分享了一下設計模式中的結構型模式之享元模式,享元模式在我們日常使用的框架和組件都有很廣泛的應用,希望通過這篇文章能夠幫助大家加深或者理解享元模式,歡迎大家一起討論交流,談談你所知道的還有哪些框架和組件中使用到了享元模式。