溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

好程序員分享java設(shè)計(jì)模式之享元模式

發(fā)布時(shí)間:2020-08-10 13:39:42 來(lái)源:ITPUB博客 閱讀:152 作者:好程序員IT 欄目:編程語(yǔ)言

  好程序員分享 java設(shè)計(jì)模式之享元模式,享元模式有點(diǎn)類(lèi)似于單例模式,都是只生成一個(gè)對(duì)象被共享使用。享元模式主要目的就是讓多個(gè)對(duì)象實(shí)現(xiàn)共享,減少不必要的內(nèi)存消耗,將多對(duì)同一對(duì)象的訪問(wèn)集中起來(lái),不必為每個(gè)訪問(wèn)者創(chuàng)建一個(gè)單獨(dú)的對(duì)象,以此來(lái)降低內(nèi)存的消耗。

 

  在享元模式結(jié)構(gòu)中包含如下幾個(gè)角色:

 

  Flyweight(抽象享元類(lèi)):通常是一個(gè)接口或抽象類(lèi),在抽象享元類(lèi)中聲明了具體享元類(lèi)公共的方法,這些方法可以向外界提供享元對(duì)象的內(nèi)部數(shù)據(jù)(內(nèi)部狀態(tài)),同時(shí)也可以通過(guò)這些方法來(lái)設(shè)置外部數(shù)據(jù)(外部狀態(tài))。

 

  ConcreteFlyweight(具體享元類(lèi)):它實(shí)現(xiàn)了抽象享元類(lèi),其實(shí)例稱(chēng)為享元對(duì)象;在具體享元類(lèi)中為內(nèi)部狀態(tài)提供了存儲(chǔ)空間。通常我們可以結(jié)合單例模式來(lái)設(shè)計(jì)具體享元類(lèi),為每一個(gè)具體享元類(lèi)提供唯一的享元對(duì)象。

 

  UnsharedConcreteFlyweight(非共享具體享元類(lèi)):并不是所有的抽象享元類(lèi)的子類(lèi)都需要被共享,不能被共享的子類(lèi)可設(shè)計(jì)為非共享具體享元類(lèi);當(dāng)需要一個(gè)非共享具體享元類(lèi)的對(duì)象時(shí)可以直接通過(guò)實(shí)例化創(chuàng)建。

 

  FlyweightFactory(享元工廠類(lèi)):享元工廠類(lèi)用于創(chuàng)建并管理享元對(duì)象,它針對(duì)抽象享元類(lèi)編程,將各種類(lèi)型的具體享元對(duì)象存儲(chǔ)在一個(gè)享元池中,享元池一般設(shè)計(jì)為一個(gè)存儲(chǔ)“鍵值對(duì)”的集合(也可以是其他類(lèi)型的集合),可以結(jié)合工廠模式進(jìn)行設(shè)計(jì);當(dāng)用戶(hù)請(qǐng)求一個(gè)具體享元對(duì)象時(shí),享元工廠提供一個(gè)存儲(chǔ)在享元池中已創(chuàng)建的實(shí)例或者創(chuàng)建一個(gè)新的實(shí)例(如果不存在的話),返回新創(chuàng)建的實(shí)例并將其存儲(chǔ)在享元池中。

 

  2、享元模式的實(shí)現(xiàn)

 

  在享元模式中引入了享元工廠類(lèi),享元工廠類(lèi)的作用在于提供一個(gè)用于存儲(chǔ)享元對(duì)象的享元池,當(dāng)用戶(hù)需要對(duì)象時(shí),首先從享元池中獲取,如果享元池中不存在,則創(chuàng)建一個(gè)新的享元對(duì)象返回給用戶(hù),并在享元池中保存該新增對(duì)象。接下來(lái),實(shí)現(xiàn)一個(gè)登陸的享元模式。

 

  3、享元模式的優(yōu)缺點(diǎn)

 

  享元模式優(yōu)點(diǎn) ,在于外部狀態(tài)相對(duì)獨(dú)立,使得對(duì)象可以在不同的環(huán)境中被復(fù)用(共享對(duì)象可以適應(yīng)不同的外部環(huán)境)。且享元模式可共享相同或相似的細(xì)粒度對(duì)象,從而減少了內(nèi)存消耗,同時(shí)降低了對(duì)象創(chuàng)建與垃圾回收的開(kāi)銷(xiāo)。

 

  享元模式缺點(diǎn),外部狀態(tài)由客戶(hù)端保存,共享對(duì)象讀取外部狀態(tài)的開(kāi)銷(xiāo)可能比較大。享元模式要求將內(nèi)部狀態(tài)與外部狀態(tài)分離,這使得程序的邏輯復(fù)雜化,同時(shí)也增加了狀態(tài)維護(hù)成本。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI