今天小編給大家分享一下Flyweight享元模式怎么實(shí)現(xiàn)的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
專注于為中小企業(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)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Flyweight(享元模式)
Flyweight(享元模式)屬于結(jié)構(gòu)型模式,是一種共享對(duì)象的設(shè)計(jì)模式。
意圖:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。
舉例子
如果看不懂上面的意圖介紹,沒(méi)有關(guān)系,設(shè)計(jì)模式需要在日常工作里用起來(lái),結(jié)合例子可以加深你的理解,下面我準(zhǔn)備了三個(gè)例子,讓你體會(huì)什么場(chǎng)景下會(huì)用到這種設(shè)計(jì)模式。
富文本編輯器的字母對(duì)象
富文本編輯器在英文環(huán)境下,其中的文本由大量字母組成,為了便于做統(tǒng)一的格式化、計(jì)算等處理,需要將每個(gè)字母都存儲(chǔ)為對(duì)象,但這樣存儲(chǔ)的代價(jià)太大了。
已知英文字母一共 26 個(gè),所以文檔中存在大量重復(fù)使用的字母,而每個(gè)字母除了位置信息外,其它信息都是相同且只讀的,那么有辦法降低富文本場(chǎng)景巨大的字母對(duì)象數(shù)量嗎?
網(wǎng)盤(pán)存儲(chǔ)
當(dāng)我們上傳一部電影時(shí),有時(shí)候幾十 GB 的內(nèi)容不到一秒就上傳完了,這是網(wǎng)盤(pán)提示你,“已采用極速技術(shù)秒傳”,你會(huì)不會(huì)心生疑惑,這么厲害的技術(shù)為什么不能每次都生效?
另外,網(wǎng)盤(pán)存儲(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)建后,再次訪問(wèn)相同對(duì)象時(shí),就不再創(chuàng)建新的對(duì)象了,而只有在訪問(wèn)沒(méi)有被緩存過(guò)的對(duì)象時(shí),才創(chuàng)建新對(duì)象,并立即緩存起來(lái)。
這樣做可以有效支持大量細(xì)粒度的對(duì)象,在富文本例子中,無(wú)數(shù)的字母就是大量細(xì)粒度對(duì)象,在網(wǎng)盤(pán)存儲(chǔ)中,電影文件就是大量細(xì)粒度對(duì)象,在大型多人游戲中,每局游戲內(nèi)存在大量細(xì)粒度對(duì)象。
這些細(xì)粒度對(duì)象都擁有相同的特征:
量特別大,這個(gè)很容易理解。
具有大量?jī)?nèi)部狀態(tài),且不隨著客戶端的不同而改變。
富文本的字母,不因?yàn)檎故镜讲煌Z(yǔ)句中而發(fā)生變化,變化的只有狀態(tài);電影文件,不因?yàn)榉旁诓煌脩舻奈募A中而對(duì)電影內(nèi)容產(chǎn)生變化,變化的只有屬于哪些用戶,放在哪些文件夾里;多人游戲中,同一把武器對(duì)象,不因?yàn)橛卸鄠€(gè)人的電腦獨(dú)立運(yùn)行而擁有更多的彈藥,變化的只有在哪些客戶端被訪問(wèn)。
具有少量外部狀態(tài),甚至沒(méi)有外部狀態(tài)。在上面已經(jīng)解釋了,字母的位置、電影的位置、游戲?qū)ο蟮目蛻舳硕际峭獠繝顟B(tài),這些外部狀態(tài)相比于其內(nèi)部狀態(tài)來(lái)說(shuō),大小微乎其微,且方便分離存儲(chǔ)。
遇到這種情況,我們就可以將對(duì)象內(nèi)部狀態(tài)共享,外部狀態(tài)獨(dú)立存儲(chǔ),從而節(jié)省大量空間。
尤其是對(duì)于網(wǎng)盤(pán)的場(chǎng)景,承諾給用戶 2 TB 的存儲(chǔ)空間,這個(gè)用戶看到其他人分享了 100 個(gè)電影,就點(diǎn)擊 “下載到我的網(wǎng)盤(pán)”,此時(shí)雖然占用了自己 1 TB 的網(wǎng)盤(pán)空間,但實(shí)際上網(wǎng)盤(pán)運(yùn)營(yíng)商并沒(méi)有增加 1 TB 的存儲(chǔ)空間,實(shí)際可能增加了 1kb 的存儲(chǔ)空間,記錄了存儲(chǔ)位置,這就是網(wǎng)盤(pán)雞賊的地方,并不占用空間的內(nèi)容,卻占用了用戶真金白銀購(gòu)買(mǎi)的存儲(chǔ)空間。
當(dāng)然,這就是享元模式的價(jià)值,對(duì)網(wǎng)盤(pán)公司來(lái)說(shuō),價(jià)值巨大,對(duì)用戶來(lái)說(shuō),沒(méi)有價(jià)值。所以享元模式的價(jià)值體現(xiàn)在全局,比如對(duì)整個(gè)富文本編輯器來(lái)說(shuō),減少了巨量字母對(duì)象數(shù)量,但對(duì)于每一個(gè)字母對(duì)象而言,并沒(méi)有任何優(yōu)化。
結(jié)構(gòu)圖
對(duì)于 Client 而言,下圖描述了如何共享 Flyweight:
Flyweight: 共享接口,通過(guò)這個(gè)接口可以操作對(duì)象的外部狀態(tài)。
ConcreteFlyweight: 實(shí)現(xiàn) Flyweight 接口的對(duì)象,這個(gè)對(duì)象是可被共享的。
UnsharedConcreteFlyweight: 不被共享的對(duì)象,因?yàn)樵谙碓J街校瑢?shí)際上并不是所有對(duì)象都可以被共享。
FlyweightFactory: 創(chuàng)建并管理 Flyweight 對(duì)象,通過(guò)其返回的 Flyweight 對(duì)象,如果已創(chuàng)建,則會(huì)返回之前創(chuàng)建的那個(gè),沒(méi)有的話才會(huì)創(chuàng)建一個(gè)新的。
Client: 使用 Flyweight 的客戶端。
通過(guò)第二個(gè)圖可以明顯看到,兩個(gè)不同的 Client 持有了相同 aConcreteFlyweight 引用。
代碼例子
下面例子使用 typescript 編寫(xiě)。
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ì)象不多,則沒(méi)必要使用享元模式。
另外,就算細(xì)粒度對(duì)象很多,如果對(duì)象內(nèi)部狀態(tài)并不多,主要都是外部狀態(tài),那么享元模式就起不到什么作用了,因?yàn)橄碓J酵ㄟ^(guò)共享對(duì)象,只能節(jié)省內(nèi)部狀態(tài),而不能節(jié)省外部狀態(tài)。
另外,如果享元模式映射到的共享對(duì)象數(shù)量并沒(méi)有比原始對(duì)象少出數(shù)量級(jí)關(guān)系,使用的意義也不大。比如富文本編輯器的例子,對(duì)于英文來(lái)說(shuō),一共就 26 個(gè)字母,那么 1 萬(wàn)字的文章優(yōu)化比例是 10000:26,但對(duì)于中文文章而言,文字實(shí)例本身就很多,可能 1 萬(wàn)字的文章中,漢字去重后依然有 3000 個(gè),那么優(yōu)化比例就是 10000:3000,此時(shí)享元模式的意義就沒(méi)那么打了。
以上就是“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://aaarwkj.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開(kāi)發(fā)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)