摘要:而享元模式的核心就是運用共享技術來有效支持大量細粒度的對象。享元模式要求將對象的屬性劃分為內部狀態和外部狀態,所以在了解享元模式之前我們先要了解兩個概念內部狀態外部狀態。一般情況下在這四種情況下應該考慮使用享元模式。
享元模式(flyweight)是一種用于性能優化的模式,之所以用“fly”其意為蠅量級。而享元模式的核心就是運用共享技術來有效支持大量細粒度的對象。雖然面向對象可以非常方便的解決一些擴展性的問題,但是在這個過程中系統勢必會產生一些類或者對象,如果系統中存在對象的個數過多時,將會導致系統的性能下降。對于這樣的問題解決最簡單直接的辦法就是減少系統中對象的個數。在javascript中,瀏覽器特別是移動端的瀏覽器分配的內存并不多,在這種情況下,節省內存就變得十分重要了。
享元模式的定義所謂享元模式就是運行共享技術有效地支持大量細粒度對象的復用系統使用少量對象,而且這些都比較相似,狀態變化小,可以實現對象的多次復用。
享元模式要求將對象的屬性劃分為內部狀態和外部狀態,所以在了解享元模式之前我們先要了解兩個概念:內部狀態、外部狀態。
在享元對象內部不隨外界環境改變而改變的共享部分。
內部屬性通常來說應該具備一下幾條特性。
內部狀態存儲于對象內部。
內部狀態可以被一些對象共享。
內部狀態獨立于具體的場景,通常不會改變。
外部狀態外部狀態取決于具體的業務場景,并根據場景而變化,不可以共享的狀態。一個外部狀態與另一個外部狀態之間是相互獨立的。
由于享元模式區分了內部狀態和外部狀態,所以我們可以通過設置不同的外部狀態使得相同的對象可以具備一些不同的特性,而內部狀態設置為相同部分。在我們的程序設計過程中,我們可能會需要大量的細粒度對象來表示對象,如果這些對象除了幾個參數不同外其他部分都相同,這個時候我們就可以利用享元模式來大大減少應用程序當中的對象。如何利用享元模式呢?這里我們只需要將他們少部分的不同的部分當做參數移動到類實例的外部去,然后再方法調用的時候將他們傳遞過來就可以了。
享元模式的使用假設我們要生產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)
當我們對象實例化次數過多,就會導致內存無限制的增長,性能可想而知。那么怎么樣避免這樣的情況出現呢。這里就要用到了享元模式。
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(品牌)為類構建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]) }
從以上的代碼我們可以看到,利用汽車的品牌作為實例的對象而不是單一的某個汽車。因為品牌再多是不會超過汽車的總數的,所以我們實際上要實例的對象就是十幾個甚至是幾個對象而已。
享元模式是為解決性能問題而生的模式,是很好的性能優化方案,但是很明顯它也會帶來一些復雜性的問題。一般情況下在這四種情況下應該考慮使用享元模式。
一個程序中使用了大量的相似對象
由于使用大量的對象造成很大的內存開銷
對象的大多數狀態都可以變為外部狀態
可以用相對較少的對象取代大量對象
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90825.html
摘要:作者按每天一個設計模式旨在初步領會設計模式的精髓,目前采用和兩種語言實現。享元模式提醒我們將一個對象的屬性劃分為內部和外部狀態。 作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 個人技術博客-godbmw.com 歡迎來玩! 每周至少 1 篇原創...
摘要:作者按每天一個設計模式旨在初步領會設計模式的精髓,目前采用和兩種語言實現。享元模式提醒我們將一個對象的屬性劃分為內部和外部狀態。 作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 個人技術博客-godbmw.com 歡迎來玩! 每周至少 1 篇原創...
摘要:享元模式享元模式是一種優化程序性能的模式本質為減少對象創建的個數。 享元模式 享元模式是一種優化程序性能的模式, 本質為減少對象創建的個數。 以下情況可以使用享元模式:有大量相似的對象, 占用了大量內存對象中大部分狀態可以抽離為外部狀態 demo某商家有 50 種男款內衣和 50 種款女款內衣, 要展示它們 方案一: 造 50 個塑料男模和 50 個塑料女模, 讓他們穿上展示, 代碼如...
摘要:享元模式通過分析應用程序的對象,將其解析為內在數據和外在數據,減少對象數量,從而提高程序的性能。通過這種方式進行事件綁定,可以減少事件處理程序的數量,這種方式叫做事件委托,也是運用了享元模式的原理。事件處理程序是公用的內在部分,每個菜單項各 github 全文地址 : YOU-SHOULD-KNOW-JS JavaScript設計模式之外觀模式 概念 外觀模式:為一組復雜子系統接口提...
閱讀 1459·2021-10-18 13:29
閱讀 2684·2021-10-12 10:18
閱讀 3580·2021-09-22 15:06
閱讀 2596·2019-08-29 17:09
閱讀 2787·2019-08-29 16:41
閱讀 1493·2019-08-29 13:48
閱讀 3226·2019-08-26 13:49
閱讀 3325·2019-08-26 13:34