Flyweight享元模式怎么實(shí)現(xiàn)

今天小編給大家分享一下Flyweight享元模式怎么實(shí)現(xiàn)的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)平潭免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

Flyweight(享元模式)

Flyweight(享元模式)屬于結(jié)構(gòu)型模式,是一種共享對(duì)象的設(shè)計(jì)模式。

意圖:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。

舉例子

如果看不懂上面的意圖介紹,沒有關(guān)系,設(shè)計(jì)模式需要在日常工作里用起來,結(jié)合例子可以加深你的理解,下面我準(zhǔn)備了三個(gè)例子,讓你體會(huì)什么場景下會(huì)用到這種設(shè)計(jì)模式。

富文本編輯器的字母對(duì)象

富文本編輯器在英文環(huán)境下,其中的文本由大量字母組成,為了便于做統(tǒng)一的格式化、計(jì)算等處理,需要將每個(gè)字母都存儲(chǔ)為對(duì)象,但這樣存儲(chǔ)的代價(jià)太大了。

已知英文字母一共 26 個(gè),所以文檔中存在大量重復(fù)使用的字母,而每個(gè)字母除了位置信息外,其它信息都是相同且只讀的,那么有辦法降低富文本場景巨大的字母對(duì)象數(shù)量嗎?

網(wǎng)盤存儲(chǔ)

當(dāng)我們上傳一部電影時(shí),有時(shí)候幾十 GB 的內(nèi)容不到一秒就上傳完了,這是網(wǎng)盤提示你,“已采用極速技術(shù)秒傳”,你會(huì)不會(huì)心生疑惑,這么厲害的技術(shù)為什么不能每次都生效?

另外,網(wǎng)盤存儲(chǔ)時(shí),同一部電影可能都會(huì)存放在不同用戶的不同文件夾中,而且電影文件又特別巨大,和富文本類似,電影文件也只有存放位置是不同的,而其余內(nèi)容都特別巨大且只讀,有什么辦法能優(yōu)化存儲(chǔ)呢?

大型多人游戲

玩多人游戲時(shí),為了防止外掛,一般對(duì)象的創(chuàng)建與計(jì)算是在服務(wù)器完成的,那如何保證一個(gè)玩家拾取物品后,另一個(gè)玩家看到的物品會(huì)消失?

其實(shí)道理已經(jīng)不言而喻了,雖然在不同客戶端之間,游戲?qū)ο笫窍嗷オ?dú)立的,但在一局游戲中,所有玩家的對(duì)象在服務(wù)器是共享的。

意圖解釋

“共享” 就是享元模式的精髓,將那些大量的,具有很多內(nèi)部狀態(tài)而外部狀態(tài)很少的對(duì)象進(jìn)行共享,就是享元模式的使用方式。

意圖:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。

共享技術(shù)可以理解為緩存,當(dāng)一個(gè)對(duì)象創(chuàng)建后,再次訪問相同對(duì)象時(shí),就不再創(chuàng)建新的對(duì)象了,而只有在訪問沒有被緩存過的對(duì)象時(shí),才創(chuàng)建新對(duì)象,并立即緩存起來。

這樣做可以有效支持大量細(xì)粒度的對(duì)象,在富文本例子中,無數(shù)的字母就是大量細(xì)粒度對(duì)象,在網(wǎng)盤存儲(chǔ)中,電影文件就是大量細(xì)粒度對(duì)象,在大型多人游戲中,每局游戲內(nèi)存在大量細(xì)粒度對(duì)象。

這些細(xì)粒度對(duì)象都擁有相同的特征:

量特別大,這個(gè)很容易理解。

具有大量內(nèi)部狀態(tài),且不隨著客戶端的不同而改變。

富文本的字母,不因?yàn)檎故镜讲煌Z句中而發(fā)生變化,變化的只有狀態(tài);電影文件,不因?yàn)榉旁诓煌脩舻奈募A中而對(duì)電影內(nèi)容產(chǎn)生變化,變化的只有屬于哪些用戶,放在哪些文件夾里;多人游戲中,同一把武器對(duì)象,不因?yàn)橛卸鄠€(gè)人的電腦獨(dú)立運(yùn)行而擁有更多的彈藥,變化的只有在哪些客戶端被訪問。

具有少量外部狀態(tài),甚至沒有外部狀態(tài)。在上面已經(jīng)解釋了,字母的位置、電影的位置、游戲?qū)ο蟮目蛻舳硕际峭獠繝顟B(tài),這些外部狀態(tài)相比于其內(nèi)部狀態(tài)來說,大小微乎其微,且方便分離存儲(chǔ)。

遇到這種情況,我們就可以將對(duì)象內(nèi)部狀態(tài)共享,外部狀態(tài)獨(dú)立存儲(chǔ),從而節(jié)省大量空間。

尤其是對(duì)于網(wǎng)盤的場景,承諾給用戶 2 TB 的存儲(chǔ)空間,這個(gè)用戶看到其他人分享了 100 個(gè)電影,就點(diǎn)擊 “下載到我的網(wǎng)盤”,此時(shí)雖然占用了自己 1 TB 的網(wǎng)盤空間,但實(shí)際上網(wǎng)盤運(yùn)營商并沒有增加 1 TB 的存儲(chǔ)空間,實(shí)際可能增加了 1kb 的存儲(chǔ)空間,記錄了存儲(chǔ)位置,這就是網(wǎng)盤雞賊的地方,并不占用空間的內(nèi)容,卻占用了用戶真金白銀購買的存儲(chǔ)空間。

當(dāng)然,這就是享元模式的價(jià)值,對(duì)網(wǎng)盤公司來說,價(jià)值巨大,對(duì)用戶來說,沒有價(jià)值。所以享元模式的價(jià)值體現(xiàn)在全局,比如對(duì)整個(gè)富文本編輯器來說,減少了巨量字母對(duì)象數(shù)量,但對(duì)于每一個(gè)字母對(duì)象而言,并沒有任何優(yōu)化。

結(jié)構(gòu)圖

對(duì)于 Client 而言,下圖描述了如何共享 Flyweight:

Flyweight: 共享接口,通過這個(gè)接口可以操作對(duì)象的外部狀態(tài)。

ConcreteFlyweight: 實(shí)現(xiàn) Flyweight 接口的對(duì)象,這個(gè)對(duì)象是可被共享的。

UnsharedConcreteFlyweight: 不被共享的對(duì)象,因?yàn)樵谙碓J街校瑢?shí)際上并不是所有對(duì)象都可以被共享。

FlyweightFactory: 創(chuàng)建并管理 Flyweight 對(duì)象,通過其返回的 Flyweight 對(duì)象,如果已創(chuàng)建,則會(huì)返回之前創(chuàng)建的那個(gè),沒有的話才會(huì)創(chuàng)建一個(gè)新的。

Client: 使用 Flyweight 的客戶端。

通過第二個(gè)圖可以明顯看到,兩個(gè)不同的 Client 持有了相同 aConcreteFlyweight 引用。

代碼例子

下面例子使用 typescript 編寫。

class FlyweightFactory {

  public getFlyWeight(key) {

    if (this.flyweight[key]) {

      return this.flyweight[key]

    }

    const flyweight = new Flyweight()

    this.flyweight[key] = flyweight

    return flyweight

  }

}

FlyweightFactory 提供的 getFlyWeight 方法,實(shí)際上是按照 key 對(duì) flyweight 實(shí)例進(jìn)行緩存,相同 key 下只存儲(chǔ)一個(gè) flyweight 實(shí)例。

弊端

如果細(xì)粒度對(duì)象不多,則沒必要使用享元模式。

另外,就算細(xì)粒度對(duì)象很多,如果對(duì)象內(nèi)部狀態(tài)并不多,主要都是外部狀態(tài),那么享元模式就起不到什么作用了,因?yàn)橄碓J酵ㄟ^共享對(duì)象,只能節(jié)省內(nèi)部狀態(tài),而不能節(jié)省外部狀態(tài)。

另外,如果享元模式映射到的共享對(duì)象數(shù)量并沒有比原始對(duì)象少出數(shù)量級(jí)關(guān)系,使用的意義也不大。比如富文本編輯器的例子,對(duì)于英文來說,一共就 26 個(gè)字母,那么 1 萬字的文章優(yōu)化比例是 10000:26,但對(duì)于中文文章而言,文字實(shí)例本身就很多,可能 1 萬字的文章中,漢字去重后依然有 3000 個(gè),那么優(yōu)化比例就是 10000:3000,此時(shí)享元模式的意義就沒那么打了。

以上就是“Flyweight享元模式怎么實(shí)現(xiàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱:Flyweight享元模式怎么實(shí)現(xiàn)
轉(zhuǎn)載注明:http://bm7419.com/article28/igecjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站排名App開發(fā)、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)