【进修设想形式】通用的单例包装器

1. 简介

Singleton(单例)形式的明白要从两个方面

  1. 它限定了类的实例化次数只能为一次,即在该实例不存在的情况下,能够经由过程一个要领建立对象实例,假如实例已存在,则返回该对象的援用。

  2. 它差别于静态类(对象),单例能够推延初始化,这一点很主要,由于能够推延初始化,就意味着不必过早地为单例分派内存资本,而是能够当须要运用时,才对其举行初始化,分派对应的内存空间。

单例的存在,在一些时刻并非功德,能够它的出现时由于体系中的模块要么是体系严密耦合,要么是其逻辑太过疏散。

2. 代码示例

var singleton = (function () {
    var instance;
    return {
        getInstance : function (factory){
            var args = Array.prototype.slice.call(arguments, 1);
            if(!instance){
                instance = {};
                factory.apply(instance, args);
            }
            return instance;
        }
    }
})();

代码中建立了一个单例的包装器,运用的示例代码以下

function Person(name, age){
    this.name = name;
    this.age = age;
    this.sayName = function () {
        console.log(this.name);
    }
}
var p1 = singleton.getInstance(Person, "zhang", 25);
var p2 = singleton.getInstance(Person);
console.log(p1 == p2); // true
console.log(p2.sayName()); // "zhang"

由于是单例,因而,我们能够把对象的要领直接放在this上,而不必放在Person的prototype对象上。然则这段代码另有不足,那就是只能发生一个组织器的单例,我们能够来对其举行革新。

var singleton = (function () {
    var instances = [],
        guid = 0;
    return {
        getInstance : function (factory){
            var args = Array.prototype.slice.call(arguments, 1);
            if(typeof factory._guid == "undefined"){ 
                instances[guid] = {};
                factory.apply(instances[guid], args);
                factory._guid = guid++;
            }
            return instances[factory._guid];
        }
    }
})();

我们能够运用一个单例池(instances)来保留差别组织器的单例,用_guid来标识是不是为该组织器生成单例,并作为下标索引猎取该单例。运用示例:

function Person(name, age){
    this.name = name;
    this.age = age;
    this.sayName = function () {
        console.log(this.name);
    }
}

var p1 = singleton.getInstance(Person, "zhang", 25);
var p2 = singleton.getInstance(Person);
console.log(p1 == p2); // true
console.log(p2.sayName()); // "zhang"

function Car(brand){
    this.brand = brand;
    this.sayBrand = function () {
        console.log(this.brand);
    }
}

var c1 = singleton.getInstance(Car, "benchi");
var c2 = singleton.getInstance(Car);
console.log(c1 == c2); // true
console.log(c2.sayBrand()); // "benchi"
    原文作者:zhangguixu
    原文地址: https://segmentfault.com/a/1190000007270565
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞