最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript設(shè)計(jì)模式 – 享元模式原理與用法實(shí)例分析

 更新時(shí)間:2020年04月15日 08:39:05   作者:李小強(qiáng)  
這篇文章主要介紹了javascript設(shè)計(jì)模式 – 享元模式,結(jié)合實(shí)例形式分析了javascript享元模式相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了javascript設(shè)計(jì)模式 – 享元模式原理與用法。分享給大家供大家參考,具體如下:

介紹:在我們?nèi)粘i_(kāi)發(fā)中需要?jiǎng)?chuàng)建很多對(duì)象,雖然垃圾回收機(jī)制能幫我們進(jìn)行回收,但是在一些需要重復(fù)創(chuàng)建對(duì)象的場(chǎng)景下,就需要有一種機(jī)制來(lái)進(jìn)行優(yōu)化,提高系統(tǒng)資源的利用率。

享元模式就是解決這類(lèi)問(wèn)題,主要目的是減少創(chuàng)建對(duì)象的數(shù)量。享元模式提倡重用現(xiàn)有同類(lèi)對(duì)象,如未找到匹配的對(duì)象則創(chuàng)建新對(duì)象

定義:運(yùn)用共享技術(shù)有效的支持大量細(xì)粒度對(duì)象的復(fù)用。系統(tǒng)只適用少量的對(duì)象,而這些對(duì)象都很相似,狀態(tài)變化很小,可以實(shí)現(xiàn)對(duì)象的多次復(fù)用。由于享元模式要求能夠共享的對(duì)象必須是細(xì)粒度的對(duì)象,因此他又稱為輕量級(jí)模式,是一種對(duì)象結(jié)構(gòu)型模式。

場(chǎng)景:我們以創(chuàng)建圓形對(duì)象為例,通過(guò)兩個(gè)例子來(lái)對(duì)比享元模式的效果。

示例:

var redCricle = new Circle('red');
redCricle.setAttr(10,10,10);
redCricle.draw();
 
var redCricle1 = new Circle('red');
redCricle1.setAttr(1,1,100);
redCricle1.draw();
 
var redCricle2 = new Circle('red');
redCricle2.setAttr(5,5,50);
redCricle2.draw();
 
var blueCricle = new Circle('blue');
blueCricle.setAttr(1,1,50);
blueCricle.draw();
 
var blueCricle1 = new Circle('blue');
blueCricle1.setAttr(12,12,50);
blueCricle1.draw();
 
var blueCricle2 = new Circle('blue');
blueCricle2.setAttr(2,12,20);
blueCricle2.draw();
// 創(chuàng)建了一個(gè)對(duì)象
// 畫(huà)圓: 顏色:red x:10 y:10 radius:10
// 創(chuàng)建了一個(gè)對(duì)象
// 畫(huà)圓: 顏色:red x:1 y:1 radius:100
// 創(chuàng)建了一個(gè)對(duì)象
// 畫(huà)圓: 顏色:red x:5 y:5 radius:50
// 創(chuàng)建了一個(gè)對(duì)象
// 畫(huà)圓: 顏色:blue x:1 y:1 radius:50
// 創(chuàng)建了一個(gè)對(duì)象
// 畫(huà)圓: 顏色:blue x:12 y:12 radius:50
// 創(chuàng)建了一個(gè)對(duì)象
// 畫(huà)圓: 顏色:blue x:2 y:12 radius:20

這種情況下每次使用都需要實(shí)例化一次Circle對(duì)象,對(duì)系統(tǒng)資源來(lái)說(shuō)是一種浪費(fèi)。

觀察下不難發(fā)現(xiàn),除了第一次需要實(shí)例化,其余的可以基于實(shí)例繼續(xù)修改。

我們修改下:

var Circle = function(color){
  console.log('創(chuàng)建了一個(gè)對(duì)象');
  this.color = color;
  this.x;
  this.y;
  this.radius;
 
  this.setAttr = function(x, y, radius){
    this.x = x;
    this.y = y;
    this.radius = radius;
  }
  this.draw = function(){
    console.log('畫(huà)圓: 顏色:' + this.color + ' x:' + this.x + ' y:' + this.y + ' radius:' + this.radius)
  }
}
 
var ShapeFactory = function(){
  this.circleMap = {};
  this.getCircle = function(color){
    var circle = this.circleMap[color];
    if(!circle){
      circle = new Circle(color);
      this.circleMap[color] = circle;
    }
    return circle;
  }
}
var factory = new ShapeFactory();
 
var redCricle = factory.getCircle('red');
redCricle.setAttr(10,10,10);
redCricle.draw();
 
var redCricle1 = factory.getCircle('red');
redCricle1.setAttr(1,1,100);
redCricle1.draw();
 
var redCricle2 = factory.getCircle('red');
redCricle2.setAttr(5,5,50);
redCricle2.draw();
 
var blueCricle = factory.getCircle('blue'); 
blueCricle.setAttr(1,1,50);
blueCricle.draw();
 
var blueCricle1 = factory.getCircle('blue');
blueCricle1.setAttr(12,12,50);
blueCricle1.draw();
 
var blueCricle2 = factory.getCircle('blue');
blueCricle2.setAttr(2,12,20);
blueCricle2.draw();
 
// 創(chuàng)建了一個(gè)對(duì)象
// 畫(huà)圓: 顏色:red x:10 y:10 radius:10
// 畫(huà)圓: 顏色:red x:1 y:1 radius:100
// 畫(huà)圓: 顏色:red x:5 y:5 radius:50
// 創(chuàng)建了一個(gè)對(duì)象
// 畫(huà)圓: 顏色:blue x:1 y:1 radius:50
// 畫(huà)圓: 顏色:blue x:12 y:12 radius:50
// 畫(huà)圓: 顏色:blue x:2 y:12 radius:20

我們通過(guò)一個(gè)工廠來(lái)動(dòng)態(tài)創(chuàng)建Circle對(duì)象,將實(shí)例進(jìn)行保存,保存的位置稱之為享元池。第二次創(chuàng)建時(shí),直接使用已有的結(jié)果。節(jié)約了系統(tǒng)資源

享元模式總結(jié):

優(yōu)點(diǎn):
* 大大減少對(duì)象的創(chuàng)建,降低系統(tǒng)內(nèi)存使用,使效率提高。
* 享元模式外部狀態(tài)獨(dú)立,不會(huì)影響其內(nèi)部狀態(tài),使得享元對(duì)象可以在不同環(huán)境被共享。

缺點(diǎn):
* 提高了系統(tǒng)復(fù)雜度,且需要相同的屬性,否則會(huì)造成系統(tǒng)混亂

適用場(chǎng)景:
* 一個(gè)系統(tǒng)有大量相同或相似的對(duì)象,造成內(nèi)存大量耗費(fèi)。
* 對(duì)象大部分狀態(tài)都可以外部化
* 在使用享元模式時(shí)需要維護(hù)一個(gè)存儲(chǔ)享元對(duì)象的享元池,而這需要耗費(fèi)一定的系統(tǒng)資源。因此使用時(shí)要衡量。

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T(mén)教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 一個(gè)簡(jiǎn)單的js漸顯(fadeIn)漸隱(fadeOut)類(lèi)

    一個(gè)簡(jiǎn)單的js漸顯(fadeIn)漸隱(fadeOut)類(lèi)

    最近發(fā)現(xiàn)項(xiàng)目用的表單驗(yàn)證不好使,干脆一邊參考人家的一邊自己寫(xiě)了一個(gè)。在驗(yàn)證有錯(cuò)誤返回提示信息用到漸顯(fadeIn)漸隱(fadeOut)過(guò)渡(因?yàn)闉g覽器的效率實(shí)在太高了,一下就蹦了出來(lái)~~);
    2010-06-06
  • Javascript類(lèi)庫(kù)的頂層對(duì)象名用戶體驗(yàn)分析

    Javascript類(lèi)庫(kù)的頂層對(duì)象名用戶體驗(yàn)分析

    針對(duì)jQuery、Ext、KISSY三者類(lèi)庫(kù)的對(duì)比及分析已經(jīng)很多了,但多數(shù)是從功能和設(shè)計(jì)的角度切入,因此本篇文章決定換一個(gè)特殊的角度,從各類(lèi)庫(kù)的頂層對(duì)象名的鍵盤(pán)輸入的體驗(yàn)上來(lái)對(duì)這三個(gè)類(lèi)庫(kù)進(jìn)行比較。
    2010-10-10
  • javascript異步編程

    javascript異步編程

    如果編程加入了時(shí)間的概念就一切變得非常復(fù)雜。通常我們的程序是飛快地解析執(zhí)行,一毫秒緊接著一毫秒,從上至下地執(zhí)行,這稱之為同步。但如果我們想讓后臺(tái)的程序不等前面的程序執(zhí)行,就執(zhí)行呢,于是就有了異步的概念。
    2010-06-06
  • javascript創(chuàng)建頁(yè)面蒙板的一些知識(shí)技巧總結(jié)

    javascript創(chuàng)建頁(yè)面蒙板的一些知識(shí)技巧總結(jié)

    javascript創(chuàng)建頁(yè)面蒙板的一些知識(shí)技巧總結(jié)...
    2007-08-08
  • 原生js獲取元素樣式的簡(jiǎn)單方法

    原生js獲取元素樣式的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇原生js獲取元素樣式的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • JavaScript實(shí)現(xiàn)五子棋小游戲

    JavaScript實(shí)現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • JavaScript高級(jí)程序設(shè)計(jì) 讀書(shū)筆記之十 本地對(duì)象Date日期

    JavaScript高級(jí)程序設(shè)計(jì) 讀書(shū)筆記之十 本地對(duì)象Date日期

    本地對(duì)象Date日期操作實(shí)現(xiàn)方法,需要的朋友可以參考下
    2012-02-02
  • confirm確認(rèn)對(duì)話框的實(shí)現(xiàn)方法總結(jié)

    confirm確認(rèn)對(duì)話框的實(shí)現(xiàn)方法總結(jié)

    下面小編就為大家?guī)?lái)一篇confirm確認(rèn)對(duì)話框的實(shí)現(xiàn)方法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • 我見(jiàn)過(guò)最全的個(gè)人js加解密功能頁(yè)面

    我見(jiàn)過(guò)最全的個(gè)人js加解密功能頁(yè)面

    利用js進(jìn)行加解密是我們經(jīng)常會(huì)遇到的一個(gè)功能,本文給大家介紹的是我目前見(jiàn)到的最全的個(gè)人js加解密功能頁(yè)面,分享出來(lái)供大家參考學(xué)習(xí),需要的朋友們隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2007-12-12
  • 基于勻速運(yùn)動(dòng)的實(shí)例講解(側(cè)邊欄,淡入淡出)

    基于勻速運(yùn)動(dòng)的實(shí)例講解(側(cè)邊欄,淡入淡出)

    下面小編就為大家?guī)?lái)一篇基于勻速運(yùn)動(dòng)的實(shí)例講解(側(cè)邊欄,淡入淡出)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10

最新評(píng)論

万安县| 桑日县| 安国市| 彭山县| 龙南县| 浦北县| 镇坪县| 淄博市| 交城县| 长沙市| 宿州市| 肇东市| 富源县| 大理市| 宿松县| 平南县| 门头沟区| 双城市| 两当县| 沁水县| 蚌埠市| 东丽区| 拉萨市| 嘉鱼县| 梅河口市| 天长市| 和平区| 花莲县| 四川省| 确山县| 安宁市| 长寿区| 彩票| 普兰县| 宜兰县| 松原市| 荆州市| 邓州市| 饶河县| 呼伦贝尔市| 长宁区|