享元模式

2015-06-15  本文已影响29人  JohnSmith

目標

通過儘量減少共享對象的數量,運用共享技術來有效支持大量細粒度的對象。

要點

核心代碼

var Upload = function(uploadType) {
    this.uploadType = uploadType;
};

var UploadFactory = (function() {
    var createdFlyWeightObjs = {};
    return {
        create: function(uploadType) {
            if (createdFlyWeightObjs[uploadType]) {
                return createdFlyWeightObjs[uploadType];
            } else {
                return createdFlyWeightObjs[uploadType] = new Upload(uploadType);
            }
        }
    };
})();

var uploadManager = (function() {
    var uploadDatabase = {};
    return {
        add: function(id, uploadType, otherParams) {
            var flyWeightObj = UploadFactory.create(uploadType);
            // 結合外部狀態進行操作
            // ...
            uploadDatabase[id] = {
                // 記錄 id 號的對象對應的外部狀態
                // ...
            };
            return flyWeightObj;
        },
        setExternalState: function(id, flyWeightObj) {
            var uploadData = uploadDatabase[id];
            for (var i in uploadData) {
                flyWeightObj[i] = uploadData[i];
            }
        }
    };  
})();
\\ 通用對象池的實現
var objectPoolFactory = function(createObjFn) {
    var objectPool = [];
    return {
        create: function() {
            var obj = objectPool.length ? objectPool.shift() : createObjFn.apply(this, arguments);
            return obj;
        },
        recover: function(obj) {
            objectPool.push(obj);
        }
    };
};

var iframeFactory = objectPoolFactory(function() {
    var iframe = document.createElement('iframe');
    // ...
    iframe.onload = function() {
        iframe.onload = null;
        iframeFactory.recover(iframe);    // iframe 加載完成之後回收
    };
    return iframe;
});

var iframe1 = iframeFactory.create();
iframe1.src = 'http://baidu.com';

setTimeout(function() {
    var iframe2 = iframeFactory().create();
    iframe2.src = 'http://qq.com';
}, 30000);
上一篇 下一篇

猜你喜欢

热点阅读