1. 程式人生 > >淺談js設計模式 — 享元模式

淺談js設計模式 — 享元模式

func 參數 如何 del 如果 性能優化 情況 under 核心

享元(flyweight)模式是一種用於性能優化的模式,“fly”在這裏是蒼蠅的意思,意為蠅量
級。享元模式的核心是運用共享技術來有效支持大量細粒度的對象。

假設有個內衣工廠,目前的產品有 50種男式內衣和 50種女士內衣,為了推銷產品,工廠決
定生產一些塑料模特來穿上他們的內衣拍成廣告照片。 正常情況下需要 50 個男模特和 50 個女
模特,然後讓他們每人分別穿上一件內衣來拍照。不使用享元模式的情況下,在程序裏也許會這
樣寫:

var Model = function(sex, underwear) {
    this.sex = sex;
    this.underwear = underwear;
};
Model.prototype.takePhoto 
= function() { console.log(‘sex= ‘ + this.sex + ‘ underwear=‘ + this.underwear); }; for(var i = 1; i <= 50; i++) { var maleModel = new Model(‘male‘, ‘underwear‘ + i); maleModel.takePhoto(); }; for(var j = 1; j <= 50; j++) { var femaleModel = new Model(‘female‘, ‘underwear‘ + j); femaleModel.takePhoto(); };

要得到一張照片,每次都需要傳入 sex 和 underwear 參數,如上所述,現在一共有 50種男內
衣和 50 種女內衣,所以一共會產生 100 個對象。如果將來生產了 10000 種內衣,那這個程序可
能會因為存在如此多的對象已經提前崩潰。
下面我們來考慮一下如何優化這個場景。雖然有 100 種內衣,但很顯然並不需要 50 個男
模特和 50 個女模特。其實男模特和女模特各自有一個就足夠了,他們可以分別穿上不同的內
衣來拍照。
現在來改寫一下代碼,既然只需要區別男女模特,那我們先把 underwear 參數從構造函數中
移除,構造函數只接收 sex 參數:

var Model = function(sex) {
    
this.sex = sex; }; Model.prototype.takePhoto = function() { console.log(‘sex= ‘ + this.sex + ‘ underwear=‘ + this.underwear); }; //分別創建一個男模特對象和一個女模特對象: var maleModel = new Model(‘male‘), femaleModel = new Model(‘female‘); //給男模特依次穿上所有的男裝,並進行拍照: for(var i = 1; i <= 50; i++) { maleModel.underwear = ‘underwear‘ + i; maleModel.takePhoto(); }; //同樣,給女模特依次穿上所有的女裝,並進行拍照: for(var j = 1; j <= 50; j++) { femaleModel.underwear = ‘underwear‘ + j; femaleModel.takePhoto(); };

可以看到,改進之後的代碼,只需要兩個對象便完成了同樣的功能。

淺談js設計模式 — 享元模式