摘要:而享元模式的核心就是運用共享技術(shù)來有效支持大量細粒度的對象。享元模式要求將對象的屬性劃分為內(nèi)部狀態(tài)和外部狀態(tài),所以在了解享元模式之前我們先要了解兩個概念內(nèi)部狀態(tài)外部狀態(tài)。一般情況下在這四種情況下應(yīng)該考慮使用享元模式。
享元模式(flyweight)是一種用于性能優(yōu)化的模式,之所以用“fly”其意為蠅量級。而享元模式的核心就是運用共享技術(shù)來有效支持大量細粒度的對象。雖然面向?qū)ο罂梢苑浅7奖愕慕鉀Q一些擴展性的問題,但是在這個過程中系統(tǒng)勢必會產(chǎn)生一些類或者對象,如果系統(tǒng)中存在對象的個數(shù)過多時,將會導(dǎo)致系統(tǒng)的性能下降。對于這樣的問題解決最簡單直接的辦法就是減少系統(tǒng)中對象的個數(shù)。在javascript中,瀏覽器特別是移動端的瀏覽器分配的內(nèi)存并不多,在這種情況下,節(jié)省內(nèi)存就變得十分重要了。
享元模式的定義所謂享元模式就是運行共享技術(shù)有效地支持大量細粒度對象的復(fù)用系統(tǒng)使用少量對象,而且這些都比較相似,狀態(tài)變化小,可以實現(xiàn)對象的多次復(fù)用。
享元模式要求將對象的屬性劃分為內(nèi)部狀態(tài)和外部狀態(tài),所以在了解享元模式之前我們先要了解兩個概念:內(nèi)部狀態(tài)、外部狀態(tài)。
在享元對象內(nèi)部不隨外界環(huán)境改變而改變的共享部分。
內(nèi)部屬性通常來說應(yīng)該具備一下幾條特性。
內(nèi)部狀態(tài)存儲于對象內(nèi)部。
內(nèi)部狀態(tài)可以被一些對象共享。
內(nèi)部狀態(tài)獨立于具體的場景,通常不會改變。
外部狀態(tài)外部狀態(tài)取決于具體的業(yè)務(wù)場景,并根據(jù)場景而變化,不可以共享的狀態(tài)。一個外部狀態(tài)與另一個外部狀態(tài)之間是相互獨立的。
由于享元模式區(qū)分了內(nèi)部狀態(tài)和外部狀態(tài),所以我們可以通過設(shè)置不同的外部狀態(tài)使得相同的對象可以具備一些不同的特性,而內(nèi)部狀態(tài)設(shè)置為相同部分。在我們的程序設(shè)計過程中,我們可能會需要大量的細粒度對象來表示對象,如果這些對象除了幾個參數(shù)不同外其他部分都相同,這個時候我們就可以利用享元模式來大大減少應(yīng)用程序當(dāng)中的對象。如何利用享元模式呢?這里我們只需要將他們少部分的不同的部分當(dāng)做參數(shù)移動到類實例的外部去,然后再方法調(diào)用的時候?qū)⑺麄儌鬟f過來就可以了。
享元模式的使用假設(shè)我們要生產(chǎn)n輛汽車,我們在不用享元模式的情況下,可能會這樣
function Car(wheel, price,seat, color, logo) { this.wheel = wheel this.price = price this.seat = seat this.color = color this.brand = logo }
然后我們就可以為所欲為了。
var car 1 = new Car(x, x, x, x, x) var car 2 = new Car(x, x, x, x, x) var car 3 = new Car(x, x, x, x, x) ............................... var car 1000 = new Car(x, x, x, x, x)
當(dāng)我們對象實例化次數(shù)過多,就會導(dǎo)致內(nèi)存無限制的增長,性能可想而知。那么怎么樣避免這樣的情況出現(xiàn)呢。這里就要用到了享元模式。
var flyWight = (function(){ // 這里是存儲器,用存儲所有的car對象 var Cars = {} var Car = function(d) { this.wheel = d.wheel this.price = d.price this.color = d.color this.seat = d.seat } // 以logo(品牌)為類構(gòu)建Car類別 var _factory = function(d) { if(!Cars[d.logo]) { Cars[d.logo] = new Car(d) } //返回該品牌的類別 return Cars[d.logo] } var carItem = { allCars : {}, //添加一輛車 addCar : function(data) { if(this.allCars[data.id]) return this.allCars[data.id] this.allCars[data.id] = { id : data.id, logo : data.logo, car : _factory(data) } }, } return carItem })() var data = [ { id: 1, wheel: 4, price: 50000, color: "red", logo: "benz", seat: 8 }, { id: 2, wheel: 4, price: 40000, color: "blue", logo: "bmw", seat: 4 }, { id: 3, wheel: 4, price: 50000, color: "red", logo: "ford", seat: 2 }, ] for(var i = 0; i < data.length; i++) { flyWight.addCar(data[i]) }
從以上的代碼我們可以看到,利用汽車的品牌作為實例的對象而不是單一的某個汽車。因為品牌再多是不會超過汽車的總數(shù)的,所以我們實際上要實例的對象就是十幾個甚至是幾個對象而已。
享元模式是為解決性能問題而生的模式,是很好的性能優(yōu)化方案,但是很明顯它也會帶來一些復(fù)雜性的問題。一般情況下在這四種情況下應(yīng)該考慮使用享元模式。
一個程序中使用了大量的相似對象
由于使用大量的對象造成很大的內(nèi)存開銷
對象的大多數(shù)狀態(tài)都可以變?yōu)橥獠繝顟B(tài)
可以用相對較少的對象取代大量對象
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90825.html
摘要:作者按每天一個設(shè)計模式旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用和兩種語言實現(xiàn)。享元模式提醒我們將一個對象的屬性劃分為內(nèi)部和外部狀態(tài)。 作者按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript和python兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實現(xiàn)方式,但此小冊只記錄最直截了當(dāng)?shù)膶崿F(xiàn)方式 :) 個人技術(shù)博客-godbmw.com 歡迎來玩! 每周至少 1 篇原創(chuàng)...
摘要:作者按每天一個設(shè)計模式旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用和兩種語言實現(xiàn)。享元模式提醒我們將一個對象的屬性劃分為內(nèi)部和外部狀態(tài)。 作者按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript和python兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實現(xiàn)方式,但此小冊只記錄最直截了當(dāng)?shù)膶崿F(xiàn)方式 :) 個人技術(shù)博客-godbmw.com 歡迎來玩! 每周至少 1 篇原創(chuàng)...
摘要:類圖相關(guān)的設(shè)計模式享元模式和代理模式當(dāng)代理模式消耗性能比較大的時候,就可以用享元模式享元模式和單例模式容器單例,享元模式就是復(fù)用對象的思想。源碼中的享元模式源碼地址享元模式參考慕課網(wǎng)設(shè)計模式精講設(shè)計模式讀書筆記享元模式 0x01.定義與類型 定義:提供了減少對象數(shù)量從而改善應(yīng)用所需的對象結(jié)構(gòu)的方法,系統(tǒng)使用少量對象,而且這些都比較相似,狀態(tài)變化小,可以實現(xiàn)對象的多次復(fù)用。 運用共享技...
摘要:享元模式享元模式是一種優(yōu)化程序性能的模式本質(zhì)為減少對象創(chuàng)建的個數(shù)。 享元模式 享元模式是一種優(yōu)化程序性能的模式, 本質(zhì)為減少對象創(chuàng)建的個數(shù)。 以下情況可以使用享元模式:有大量相似的對象, 占用了大量內(nèi)存對象中大部分狀態(tài)可以抽離為外部狀態(tài) demo某商家有 50 種男款內(nèi)衣和 50 種款女款內(nèi)衣, 要展示它們 方案一: 造 50 個塑料男模和 50 個塑料女模, 讓他們穿上展示, 代碼如...
摘要:享元模式通過分析應(yīng)用程序的對象,將其解析為內(nèi)在數(shù)據(jù)和外在數(shù)據(jù),減少對象數(shù)量,從而提高程序的性能。通過這種方式進行事件綁定,可以減少事件處理程序的數(shù)量,這種方式叫做事件委托,也是運用了享元模式的原理。事件處理程序是公用的內(nèi)在部分,每個菜單項各 github 全文地址 : YOU-SHOULD-KNOW-JS JavaScript設(shè)計模式之外觀模式 概念 外觀模式:為一組復(fù)雜子系統(tǒng)接口提...
閱讀 1496·2021-10-18 13:29
閱讀 2826·2021-10-12 10:18
閱讀 3616·2021-09-22 15:06
閱讀 2621·2019-08-29 17:09
閱讀 2829·2019-08-29 16:41
閱讀 1525·2019-08-29 13:48
閱讀 3253·2019-08-26 13:49
閱讀 3352·2019-08-26 13:34