設(shè)計(jì)模式:享元模式
什么是享元模式
首先我們需要簡單了解一下什么是享元模式。享元模式(Flyweight Pattern):主要用于減少創(chuàng)建對象的數(shù)量,以減少內(nèi)存占用和提高性能。享元模式的重點(diǎn)就在這個(gè)享字,通過一些共享技術(shù)來減少對象的創(chuàng)建,實(shí)際上Java中String值的存儲,Volley中的ByteArrayPool
也使用到了享元模式,這對提高性能很有用。
感覺目前大部分的緩存機(jī)制都會用到享元模式。
享元模式結(jié)構(gòu)圖
享元模式在一般情況下可以分成四個(gè)部分,也可以大體分為兩部分,分別是享元工廠類
,享元(抽象)類
。如果學(xué)習(xí)過池有關(guān)的概念的話,我們就可以把享元工廠類
看做是一個(gè)池(Pool),享元類
看做是池中的數(shù)據(jù)。
標(biāo)準(zhǔn)享元模式的結(jié)構(gòu)圖:
可以看到除了共享的享元類之外還有一類不參與共享的享元類,因?yàn)橄碓J街皇鞘构蚕沓蔀榭赡芏粡?qiáng)制共享。
享元模式工作的一般流程
享元模式工作的流程和緩存機(jī)制很像(或許應(yīng)該說緩存機(jī)制和它很像嗎),當(dāng)我們需要獲取一個(gè)享元對象時(shí)享元工廠會檢查其存儲空間中是否已經(jīng)有所需要的享元實(shí)例,如果有就將它直接返回,如果沒有就創(chuàng)建一個(gè)并加入到享元工廠的存儲空間中去。
享元模式的簡單實(shí)現(xiàn)(Kotlin)
首先我們直接定義一個(gè)享元類:
class flyweight(val id:Int) {
var message = "empty body"
fun execute(){
println(message)
}
}
這里我們就不定義接口什么的了,直接創(chuàng)建一個(gè)簡單的例子。這是一個(gè)享元類,它有兩個(gè)參數(shù),分別是id和message。id值是每個(gè)享元類唯一確定的一個(gè)值,相當(dāng)于數(shù)據(jù)庫中的主鍵,我們想要通過這個(gè)值來判斷這個(gè)享元類是否是我們想要的實(shí)例。message對象和享元類的具體執(zhí)行有關(guān)。
接著我們定義一個(gè)工廠類:
class flyweightFactory{
val Pool = HashMap<Int,flyweight>()
fun getFlyweight(id: Int,msg:String):flyweight{
if (!Pool.containsKey(id)){ //如果沒有找到對應(yīng)的實(shí)例就新創(chuàng)建一個(gè)
val newInstance = flyweight(id)
Pool.put(id,newInstance)
}
return Pool.get(id)?.apply {
message = msg
}!!
}
}
這個(gè)類的邏輯很簡單,它內(nèi)部有一個(gè)Pool
變量來存儲享元對象。還有一個(gè)getFlyweight
方法用于獲取它內(nèi)部管理的享元對象,該方法有兩個(gè)參數(shù),第一個(gè)參數(shù)即為我們想要獲得的享元實(shí)例的id,這是用于判斷我們想要的享元實(shí)例是否存在,第二個(gè)參數(shù)將會被賦予給最后返回的享元對象的message中,用來影響享元對象的execute
方法的執(zhí)行結(jié)果。
內(nèi)部狀態(tài)和外部狀態(tài)
內(nèi)部狀態(tài)和外部狀態(tài)的概念干講比較抽象,所以我們給完上面的簡單例子之后結(jié)合來講。首先我們聯(lián)系享元模式的使用場景,其中之一就是擁有眾多重復(fù)內(nèi)容的對象,比如說一個(gè)ppt模板,對于ppt來說可能大部分的結(jié)構(gòu)都是一致的,不變的只有上面顯示的文字。這種情況下如果把ppt抽象成一個(gè)類的話,我們就可以共享它的模板,這個(gè)模板屬于這個(gè)類內(nèi)部的,我們稱之為內(nèi)部狀態(tài)
,一般內(nèi)部狀態(tài)是不會被外部調(diào)用給更改的。而ppt需要顯示的文字就屬于是外部狀態(tài)
,它取決于外部調(diào)用傳入的參數(shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-712569.html
我們可以對照上面的例子,其中顯然flyweight類的id參數(shù)為內(nèi)部參數(shù),因?yàn)樗坏┬纬墒遣浑S外部傳入的參數(shù)而改變的,這也可以看做是我們共享的東西。再抽象一點(diǎn),這個(gè)execute方法也是內(nèi)部狀態(tài),因?yàn)樗倪壿嬕膊浑S外部參數(shù)而改變。而其中哪個(gè)message參數(shù)就是外部狀態(tài),因?yàn)樗看味紩S著外部傳入的參數(shù)而改變。文章來源地址http://www.zghlxwxcb.cn/news/detail-712569.html
到了這里,關(guān)于設(shè)計(jì)模式:享元模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!