一. 概念
定義:Use sharing to support large numbers of fine-grained objects efficiently.使用共享的方式避免創(chuàng)建銷毀大量對(duì)象資源的開銷。
意圖:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。
主要解決:在有大量對(duì)象時(shí),有可能會(huì)造成內(nèi)存溢出,我們把其中共同的部分抽象出來(lái),如果有相同的業(yè)務(wù)請(qǐng)求,直接返回在內(nèi)存中已有的對(duì)象,避免重新創(chuàng)建。
何時(shí)使用: 1、系統(tǒng)中有大量對(duì)象。 2、這些對(duì)象消耗大量?jī)?nèi)存。 3、這些對(duì)象的狀態(tài)大部分可以外部化。 4、這些對(duì)象可以按照內(nèi)蘊(yùn)狀態(tài)分為很多組,當(dāng)把外蘊(yùn)對(duì)象從對(duì)象中剔除出來(lái)時(shí),每一組對(duì)象都可以用一個(gè)對(duì)象來(lái)代替。 5、系統(tǒng)不依賴于這些對(duì)象身份,這些對(duì)象是不可分辨的。
如何解決:用唯一標(biāo)識(shí)碼判斷,如果在內(nèi)存中有,則返回這個(gè)唯一標(biāo)識(shí)碼所標(biāo)識(shí)的對(duì)象。
關(guān)鍵代碼:用 HashMap 存儲(chǔ)這些對(duì)象。
應(yīng)用實(shí)例: 1、JAVA 中的 String,如果有則返回,如果沒(méi)有則創(chuàng)建一個(gè)字符串保存在字符串緩存池里面。 2、數(shù)據(jù)庫(kù)的數(shù)據(jù)池。
優(yōu)點(diǎn):大大減少對(duì)象的創(chuàng)建,降低系統(tǒng)的內(nèi)存,使效率提高。
缺點(diǎn):提高了系統(tǒng)的復(fù)雜度,需要分離出外部狀態(tài)和內(nèi)部狀態(tài),而且外部狀態(tài)具有固有化的性質(zhì),不應(yīng)該隨著內(nèi)部狀態(tài)的變化而變化,否則會(huì)造成系統(tǒng)的混亂。
使用場(chǎng)景: 1、系統(tǒng)有大量相似對(duì)象。 2、需要緩沖池的場(chǎng)景。
注意事項(xiàng): 1、注意劃分外部狀態(tài)和內(nèi)部狀態(tài),否則可能會(huì)引起線程安全問(wèn)題。 2、這些類必須有一個(gè)工廠對(duì)象加以控制。
二. 場(chǎng)景
三. 代碼
偽代碼:關(guān)鍵的三個(gè)類,抽象父親類,子類,共享工廠。
抽象父親類
{
抽象方法
}
具體子類
{
實(shí)現(xiàn)抽象方法
}
共享工廠類
{
共享池
對(duì)象生產(chǎn)方法
}