成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

設(shè)計(jì)模式之享元模式

Jioby / 2920人閱讀

摘要:而享元模式的核心就是運(yùn)用共享技術(shù)來(lái)有效支持大量細(xì)粒度的對(duì)象。享元模式要求將對(duì)象的屬性劃分為內(nèi)部狀態(tài)和外部狀態(tài),所以在了解享元模式之前我們先要了解兩個(gè)概念內(nèi)部狀態(tài)外部狀態(tài)。一般情況下在這四種情況下應(yīng)該考慮使用享元模式。

享元模式(flyweight)是一種用于性能優(yōu)化的模式,之所以用“fly”其意為蠅量級(jí)。而享元模式的核心就是運(yùn)用共享技術(shù)來(lái)有效支持大量細(xì)粒度的對(duì)象。雖然面向?qū)ο罂梢苑浅7奖愕慕鉀Q一些擴(kuò)展性的問(wèn)題,但是在這個(gè)過(guò)程中系統(tǒng)勢(shì)必會(huì)產(chǎn)生一些類或者對(duì)象,如果系統(tǒng)中存在對(duì)象的個(gè)數(shù)過(guò)多時(shí),將會(huì)導(dǎo)致系統(tǒng)的性能下降。對(duì)于這樣的問(wèn)題解決最簡(jiǎn)單直接的辦法就是減少系統(tǒng)中對(duì)象的個(gè)數(shù)。在javascript中,瀏覽器特別是移動(dòng)端的瀏覽器分配的內(nèi)存并不多,在這種情況下,節(jié)省內(nèi)存就變得十分重要了。

享元模式的定義

所謂享元模式就是運(yùn)行共享技術(shù)有效地支持大量細(xì)粒度對(duì)象的復(fù)用系統(tǒng)使用少量對(duì)象,而且這些都比較相似,狀態(tài)變化小,可以實(shí)現(xiàn)對(duì)象的多次復(fù)用。
享元模式要求將對(duì)象的屬性劃分為內(nèi)部狀態(tài)和外部狀態(tài),所以在了解享元模式之前我們先要了解兩個(gè)概念:內(nèi)部狀態(tài)、外部狀態(tài)。

內(nèi)部狀態(tài)

在享元對(duì)象內(nèi)部不隨外界環(huán)境改變而改變的共享部分。
內(nèi)部屬性通常來(lái)說(shuō)應(yīng)該具備一下幾條特性。

內(nèi)部狀態(tài)存儲(chǔ)于對(duì)象內(nèi)部。

內(nèi)部狀態(tài)可以被一些對(duì)象共享。

內(nèi)部狀態(tài)獨(dú)立于具體的場(chǎng)景,通常不會(huì)改變。

外部狀態(tài)

外部狀態(tài)取決于具體的業(yè)務(wù)場(chǎng)景,并根據(jù)場(chǎng)景而變化,不可以共享的狀態(tài)。一個(gè)外部狀態(tài)與另一個(gè)外部狀態(tài)之間是相互獨(dú)立的。

由于享元模式區(qū)分了內(nèi)部狀態(tài)和外部狀態(tài),所以我們可以通過(guò)設(shè)置不同的外部狀態(tài)使得相同的對(duì)象可以具備一些不同的特性,而內(nèi)部狀態(tài)設(shè)置為相同部分。在我們的程序設(shè)計(jì)過(guò)程中,我們可能會(huì)需要大量的細(xì)粒度對(duì)象來(lái)表示對(duì)象,如果這些對(duì)象除了幾個(gè)參數(shù)不同外其他部分都相同,這個(gè)時(shí)候我們就可以利用享元模式來(lái)大大減少應(yīng)用程序當(dāng)中的對(duì)象。如何利用享元模式呢?這里我們只需要將他們少部分的不同的部分當(dāng)做參數(shù)移動(dòng)到類實(shí)例的外部去,然后再方法調(diào)用的時(shí)候?qū)⑺麄儌鬟f過(guò)來(lái)就可以了。

享元模式的使用

假設(shè)我們要生產(chǎn)n輛汽車,我們?cè)诓挥孟碓J降那闆r下,可能會(huì)這樣

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)我們對(duì)象實(shí)例化次數(shù)過(guò)多,就會(huì)導(dǎo)致內(nèi)存無(wú)限制的增長(zhǎng),性能可想而知。那么怎么樣避免這樣的情況出現(xiàn)呢。這里就要用到了享元模式。

var flyWight  = (function(){
    // 這里是存儲(chǔ)器,用存儲(chǔ)所有的car對(duì)象
    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í)例的對(duì)象而不是單一的某個(gè)汽車。因?yàn)槠放圃俣嗍遣粫?huì)超過(guò)汽車的總數(shù)的,所以我們實(shí)際上要實(shí)例的對(duì)象就是十幾個(gè)甚至是幾個(gè)對(duì)象而已。
享元模式是為解決性能問(wèn)題而生的模式,是很好的性能優(yōu)化方案,但是很明顯它也會(huì)帶來(lái)一些復(fù)雜性的問(wèn)題。一般情況下在這四種情況下應(yīng)該考慮使用享元模式。

一個(gè)程序中使用了大量的相似對(duì)象

由于使用大量的對(duì)象造成很大的內(nèi)存開(kāi)銷

對(duì)象的大多數(shù)狀態(tài)都可以變?yōu)橥獠繝顟B(tài)

可以用相對(duì)較少的對(duì)象取代大量對(duì)象

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/90825.html

相關(guān)文章

  • 每天一個(gè)設(shè)計(jì)模式享元模式

    摘要:作者按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用和兩種語(yǔ)言實(shí)現(xiàn)。享元模式提醒我們將一個(gè)對(duì)象的屬性劃分為內(nèi)部和外部狀態(tài)。 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語(yǔ)言實(shí)現(xiàn)。誠(chéng)然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式 :) 個(gè)人技術(shù)博客-godbmw.com 歡迎來(lái)玩! 每周至少 1 篇原創(chuàng)...

    jone5679 評(píng)論0 收藏0
  • 每天一個(gè)設(shè)計(jì)模式享元模式

    摘要:作者按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用和兩種語(yǔ)言實(shí)現(xiàn)。享元模式提醒我們將一個(gè)對(duì)象的屬性劃分為內(nèi)部和外部狀態(tài)。 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語(yǔ)言實(shí)現(xiàn)。誠(chéng)然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式 :) 個(gè)人技術(shù)博客-godbmw.com 歡迎來(lái)玩! 每周至少 1 篇原創(chuàng)...

    ormsf 評(píng)論0 收藏0
  • 設(shè)計(jì)模式享元模式

    摘要:類圖相關(guān)的設(shè)計(jì)模式享元模式和代理模式當(dāng)代理模式消耗性能比較大的時(shí)候,就可以用享元模式享元模式和單例模式容器單例,享元模式就是復(fù)用對(duì)象的思想。源碼中的享元模式源碼地址享元模式參考慕課網(wǎng)設(shè)計(jì)模式精講設(shè)計(jì)模式讀書筆記享元模式 0x01.定義與類型 定義:提供了減少對(duì)象數(shù)量從而改善應(yīng)用所需的對(duì)象結(jié)構(gòu)的方法,系統(tǒng)使用少量對(duì)象,而且這些都比較相似,狀態(tài)變化小,可以實(shí)現(xiàn)對(duì)象的多次復(fù)用。 運(yùn)用共享技...

    vvpale 評(píng)論0 收藏0
  • javascript享元模式

    摘要:享元模式享元模式是一種優(yōu)化程序性能的模式本質(zhì)為減少對(duì)象創(chuàng)建的個(gè)數(shù)。 享元模式 享元模式是一種優(yōu)化程序性能的模式, 本質(zhì)為減少對(duì)象創(chuàng)建的個(gè)數(shù)。 以下情況可以使用享元模式:有大量相似的對(duì)象, 占用了大量?jī)?nèi)存對(duì)象中大部分狀態(tài)可以抽離為外部狀態(tài) demo某商家有 50 種男款內(nèi)衣和 50 種款女款內(nèi)衣, 要展示它們 方案一: 造 50 個(gè)塑料男模和 50 個(gè)塑料女模, 讓他們穿上展示, 代碼如...

    BlackHole1 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式之結(jié)構(gòu)型設(shè)計(jì)模式

    摘要:享元模式通過(guò)分析應(yīng)用程序的對(duì)象,將其解析為內(nèi)在數(shù)據(jù)和外在數(shù)據(jù),減少對(duì)象數(shù)量,從而提高程序的性能。通過(guò)這種方式進(jìn)行事件綁定,可以減少事件處理程序的數(shù)量,這種方式叫做事件委托,也是運(yùn)用了享元模式的原理。事件處理程序是公用的內(nèi)在部分,每個(gè)菜單項(xiàng)各 github 全文地址 : YOU-SHOULD-KNOW-JS JavaScript設(shè)計(jì)模式之外觀模式 概念 外觀模式:為一組復(fù)雜子系統(tǒng)接口提...

    xiaoqibTn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<