本文僅供筆者平時學(xué)習(xí)記錄之用萍鲸,侵刪
原文:https://mp.weixin.qq.com/s/wgif924nydDHWqG9FqTRdg
享元模式
享元模式(英語:Flyweight Pattern)是一種軟件設(shè)計模式骇陈。它使用共享物件坯门,用來盡可能減少內(nèi)存使用量以及分享資訊給盡可能多的相似物件躺盛;它適合用于當(dāng)大量物件只是重復(fù)因而導(dǎo)致無法令人接受的使用大量內(nèi)存肋联。通常物件中的部分狀態(tài)是可以分享故爵。常見做法是把它們放在外部數(shù)據(jù)結(jié)構(gòu),當(dāng)需要使用時再將它們傳遞給享元梗逮。
關(guān)鍵字:減少內(nèi)存项秉,共享物件,外部數(shù)據(jù)
簡單點描述一下就是一批對象中既有相同的內(nèi)容也有不同的內(nèi)容慷彤,相同的內(nèi)容采用共享的方式娄蔼,不同的內(nèi)容通過動態(tài)傳遞的方式,來盡量減少對象的產(chǎn)生底哗。這里需要理解的一點是贷屎,這多個對象其實底層對應(yīng)的是同一個對象,物理地址是一個艘虎。
享元模式使用場景
享元模式的使用場景還是比較多的唉侄,最常見的一個場景就是 Java JDK 里面的 String 字符串類,因為 JVM 中有常量池野建,常量池的實現(xiàn)就是一種享元模式属划,避免多個相同對象的存在恬叹。另外線程池以及很多用到緩沖池的地方都采用了享元模式,比如 Integer 類中默認(rèn)緩存了-128 -127 之間的整數(shù)同眯,等等場景绽昼。
在演示享元模式之前,我們要先了解享元模式中涉及到的幾個角色名稱
- 抽象享元類:通常是一個接口须蜗,主要對外提供修改內(nèi)部數(shù)據(jù)的接口
- 具體享元類:享元的實現(xiàn)類硅确,通常存儲在內(nèi)存中,便于使用
- 享元工廠類:對外創(chuàng)建具體享元類
下面我們通過一個簡單的示例來演示一下享元模式明肮,我們創(chuàng)建一個接口類菱农,然后寫一個實現(xiàn)類,再通過一個工廠來創(chuàng)建享元類柿估,相關(guān)代碼如下:
UML 圖解
代碼演示
我們先創(chuàng)建一個接口類 IFlyweight.java循未,里面包含一個設(shè)置寬度的方法,如下
然后編寫一個實現(xiàn)類 FlyweightImpl.java 來實現(xiàn)接口秫舌,并且在構(gòu)造函數(shù)中傳遞一個 Color 對象的妖。
第三步我們再編寫一個工廠類 FlyweightFactory.java,里面有一個 Color 對象的本地緩存足陨,對于相同的顏色只保存一個對象嫂粟。
顏色輔助類 Color.java
最后寫一個測試應(yīng)用類 FlyweightDemo.java
上面測試類中,我們分別定義了兩種顏色的三個對象墨缘,由于相同顏色的對象已經(jīng)被緩存了星虹,所以我們輸出的結(jié)果如下:
輸出結(jié)果
從上面的運行結(jié)果中,我們可以看出飒房,flyweight0 與flyweight1 其實是同一個對象搁凸,雖然他們的 width 和 height 屬性值不一樣,但是他們的底層對應(yīng)的是同一個對象本身狠毯。這就是享元模式的核心內(nèi)容护糖,通過共享變量,來減少對象的產(chǎn)生嚼松,從而減少內(nèi)存的使用嫡良。
總結(jié)
今天跟大家分享了一下設(shè)計模式中的結(jié)構(gòu)型模式之享元模式,享元模式在我們?nèi)粘J褂玫目蚣芎徒M件都有很廣泛的應(yīng)用献酗,希望通過這篇文章能夠幫助大家加深或者理解享元模式寝受,歡迎大家一起討論交流,談?wù)勀闼赖倪€有哪些框架和組件中使用到了享元模式罕偎。