国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

每天一個設(shè)計模式之享元模式

jone5679 / 708人閱讀

摘要:作者按每天一個設(shè)計模式旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用和兩種語言實現(xiàn)。享元模式提醒我們將一個對象的屬性劃分為內(nèi)部和外部狀態(tài)。

作者按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascriptpython兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實現(xiàn)方式,但此小冊只記錄最直截了當(dāng)?shù)膶崿F(xiàn)方式 :)

個人技術(shù)博客-godbmw.com 歡迎來玩! 每周至少 1 篇原創(chuàng)技術(shù)分享,還有開源教程(webpack、設(shè)計模式)、面試刷題(偏前端)、知識整理(每周零碎),歡迎長期關(guān)注!本篇博客地址是:《每天一個設(shè)計模式之享元模式》。

如果您也想進行知識整理 + 搭建功能完善/設(shè)計簡約/快速啟動的個人博客,請直接戳theme-bmw

0. 項目地址

享元模式·代碼

《每天一個設(shè)計模式》地址

1. 什么是“享元模式”?
享元模式:運用共享技術(shù)來減少創(chuàng)建對象的數(shù)量,從而減少內(nèi)存占用、提高性能。

享元模式提醒我們將一個對象的屬性劃分為內(nèi)部和外部狀態(tài)

內(nèi)部狀態(tài):可以被對象集合共享,通常不會改變

外部狀態(tài):根據(jù)應(yīng)用場景經(jīng)常改變

享元模式是利用時間換取空間的優(yōu)化模式。

2. 應(yīng)用場景

享元模式雖然名字聽起來比較高深,但是實際使用非常容易:只要是需要大量創(chuàng)建重復(fù)的類的代碼塊,均可以使用享元模式抽離內(nèi)部/外部狀態(tài),減少重復(fù)類的創(chuàng)建。

為了顯示它的強大,下面的代碼是簡單地實現(xiàn)了大家耳熟能詳?shù)摹皩ο蟪亍?,以彰顯這種設(shè)計模式的魅力。

3. 代碼實現(xiàn)

這里利用pythonjavascript實現(xiàn)了一個“通用對象池”類--ObjectPool。這個類管理一個裝載空閑對象的數(shù)組,如果外部需要一個對象,直接從對象池中獲取,而不是通過new操作。

對象池可以大量減少重復(fù)創(chuàng)建相同的對象,從而節(jié)省了系統(tǒng)內(nèi)存,提高運行效率。

為了形象說明“享元模式”在“對象池”實現(xiàn)和應(yīng)用,特別準備了模擬了File類,并且模擬了“文件下載”操作。

通過閱讀下方代碼可以發(fā)現(xiàn):對于File類,內(nèi)部狀態(tài)是pool屬性和download方法;外部狀態(tài)是namesrc(文件名和文件鏈接)。借助對象池,實現(xiàn)了File類的復(fù)用。

注:為了方便演示,Javascript實現(xiàn)的是并發(fā)操作,Python實現(xiàn)的是串行操作。輸出結(jié)果略有不同。

3.1 Python3 實現(xiàn)
from time import sleep


class ObjectPool:  # 通用對象池
    def __init__(self):
        self.__pool = []

    # 創(chuàng)建對象
    def create(self, Obj):
        # 對象池中沒有空閑對象,則創(chuàng)建一個新的對象
        # 對象池中有空閑對象,直接取出,無需再次創(chuàng)建
        return self.__pool.pop() if len(self.__pool) > 0 else Obj(self)

    # 對象回收
    def recover(self, obj):
        return self.__pool.append(obj)

    # 對象池大小
    def size(self):
        return len(self.__pool)


class File:  # 模擬文件對象
    def __init__(self, pool):
        self.__pool = pool

    def download(self):  # 模擬下載操作
        print("+ 從", self.src, "開始下載", self.name)
        sleep(0.1)
        print("-", self.name, "下載完成")
        # 下載完畢后,將對象重新放入對象池
        self.__pool.recover(self)


if __name__ == "__main__":
    obj_pool = ObjectPool()

    file1 = obj_pool.create(File)
    file1.name = "文件1"
    file1.src = "https://download1.com"
    file1.download()

    file2 = obj_pool.create(File)
    file2.name = "文件2"
    file2.src = "https://download2.com"
    file2.download()

    file3 = obj_pool.create(File)
    file3.name = "文件3"
    file3.src = "https://download3.com"
    file3.download()

    print("*" * 20)
    print("下載了3個文件, 但其實只創(chuàng)建了", obj_pool.size(), "個對象")

輸出結(jié)果(這里為了方便演示直接使用了sleep方法,沒有再用多線程模擬):

+ 從 https://download1.com 開始下載 文件1
- 文件1 下載完成
+ 從 https://download2.com 開始下載 文件2
- 文件2 下載完成
+ 從 https://download3.com 開始下載 文件3
- 文件3 下載完成
********************
下載了3個文件, 但其實只創(chuàng)建了 1 個對象
3.2 ES6 實現(xiàn)
// 對象池
class ObjectPool {
  constructor() {
    this._pool = []; //
  }

  // 創(chuàng)建對象
  create(Obj) {
    return this._pool.length === 0
      ? new Obj(this) // 對象池中沒有空閑對象,則創(chuàng)建一個新的對象
      : this._pool.shift(); // 對象池中有空閑對象,直接取出,無需再次創(chuàng)建
  }

  // 對象回收
  recover(obj) {
    return this._pool.push(obj);
  }

  // 對象池大小
  size() {
    return this._pool.length;
  }
}

// 模擬文件對象
class File {
  constructor(pool) {
    this.pool = pool;
  }

  // 模擬下載操作
  download() {
    console.log(`+ 從 ${this.src} 開始下載 ${this.name}`);
    setTimeout(() => {
      console.log(`- ${this.name} 下載完畢`); // 下載完畢后, 將對象重新放入對象池
      this.pool.recover(this);
    }, 100);
  }
}

/****************** 以下是測試函數(shù) **********************/

let objPool = new ObjectPool();

let file1 = objPool.create(File);
file1.name = "文件1";
file1.src = "https://download1.com";
file1.download();

let file2 = objPool.create(File);
file2.name = "文件2";
file2.src = "https://download2.com";
file2.download();

setTimeout(() => {
  let file3 = objPool.create(File);
  file3.name = "文件3";
  file3.src = "https://download3.com";
  file3.download();
}, 200);

setTimeout(
  () =>
    console.log(
      `${"*".repeat(50)}
下載了3個文件,但其實只創(chuàng)建了${objPool.size()}個對象`
    ),
  1000
);

輸出結(jié)果如下:

+ 從 https://download1.com 開始下載 文件1
+ 從 https://download2.com 開始下載 文件2
- 文件1 下載完畢
- 文件2 下載完畢
+ 從 https://download3.com 開始下載 文件3
- 文件3 下載完畢
**************************************************
下載了3個文件,但其實只創(chuàng)建了2個對象
4. 參考

《JavaScript 設(shè)計模式和開發(fā)實踐》

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/100237.html

相關(guān)文章

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

    摘要:作者按每天一個設(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)...

    ormsf 評論0 收藏0
  • 設(shè)計模式享元模式

    摘要:而享元模式的核心就是運用共享技術(shù)來有效支持大量細粒度的對象。享元模式要求將對象的屬性劃分為內(nèi)部狀態(tài)和外部狀態(tài),所以在了解享元模式之前我們先要了解兩個概念內(nèi)部狀態(tài)外部狀態(tài)。一般情況下在這四種情況下應(yīng)該考慮使用享元模式。 享元模式(flyweight)是一種用于性能優(yōu)化的模式,之所以用fly其意為蠅量級。而享元模式的核心就是運用共享技術(shù)來有效支持大量細粒度的對象。雖然面向?qū)ο罂梢苑浅7奖愕?..

    Jioby 評論0 收藏0
  • 設(shè)計模式享元模式

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

    vvpale 評論0 收藏0
  • javascript享元模式

    摘要:享元模式享元模式是一種優(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 個塑料女模, 讓他們穿上展示, 代碼如...

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

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

    xiaoqibTn 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<