美文网首页
JS 单例模式

JS 单例模式

作者: rocneal | 来源:发表于2016-10-12 01:06 被阅读0次
1. 常见实现单例

要实现一个标准的单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。

代码如下:

// 常见单例模式函数
var Singleton = function(name) {
    this.name = name;
    // 实例创建表示
    this.instance = null;
};
Singleton.prototype.getName = function() {
    return this.name;
};

// 获取实例方法
Singleton.getInstance = function(name) {
    if (!this.instance) {
        this.instance = new Singleton(name);
    }
    return this.instance;
};

var s1 = Singleton.getInstance();
var s2 = Singleton.getInstance();
console.info(s1 === s2); // true

或者:

// 常见单例模式函数
var Singleton = function(name) {
    this.name = name;
};
Singleton.prototype.getName = function() {
    return this.name;
};

// 获取实例方法
Singleton.getInstance = (function(name) {
    // 实例创建表示
    var instance = null;
    return function(name) {
        if (!instance) {
            instance = new Singleton(name);
        }
    return instance;
  }
})();

说明:

我们通过 Singleton.getInstance 来获取 Singleton 类的唯一对象,这种方式相对简单,但有 一个问题,就是增加了这个类的“不透明性”,Singleton 类的使用者必须知道这是一个单例类, 跟以往通过 new XXX 的方式来获取对象不同,这里偏要使用 Singleton.getInstance 来获取对象。

虽然现在已经完成了一个单例模式的编写,但这段单例模式代码的意义并不大,我们会写出更好的单例。

2. 透明单例模式

我们现在的目标是实现一个“透明”的单例类,用户从这个类中创建对象的时候,可以像使 用其他任何普通类一样。

代码如下:

// 创建唯一Div的单例模式方法
var SingletonDiv = (function() {
    var instance = null;
    return function() {
        if (!instance) {
            instance = document.createElement('div');
            instance = '<h1>Div</h1>';
        }
        return instance;
    }
})();

var s1 = new SingletonDiv();
var s2 = new SingletonDiv();
console.info(s1 === s2); // true

说明:

虽然现在完成了一个透明的单例类的编写,但它同样有一些缺点。

为了把 instance 封装起来,我们使用了自执行的匿名函数和闭包,并且让这个匿名函数返回真正的 SingletonDiv 构造方法。

3. JS 通用单例

通过 getSingle 函数,可以灵活的产出各个组件的单例模式函数。

/**
 * 获取单例函数
 * @param  {Function} fn 创建对象函数
 * @return {Function}    单例函数
 */
function getSingle(fn) {
    var result;
    return function() {
        return result || (result = fn.apply(this, arguments));
    }
}

// 产出Div函数
var getDiv = function() {
    var div = document.createElement('div');
    div.innerHTML = '<h1>Div</h1>';
    return div;
}

// 获取Div产出的单例模式函数
var getDivSingle = getSingle(getDiv);
var x1 = getDivSingle();
var x2 = getDivSingle();
console.info(x1 === x2); // true

var y1 = getDiv();
var y2 = getDiv();
console.info(y1 === y2); // false

相关文章

  • 前端开发工程师必备系列-几个简单的JS单例模式

    前端开发工程师必备系列-几个简单的JS单例模式 JavaScript单例模式 1. 单例模式 单例模式(Singl...

  • 前端设计模式

    JS设计模式一:工厂模式jS设计模式二:单例模式JS设计模式三:模块模式JS设计模式四:代理模式JS设计模式五:职...

  • JavaScript-高级篇之单例模式

    单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点 JS特色的单例模式 惰性单例

  • JS_单例模式

    JS_单例模式 什么是单例模式? 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式的优点 可以用来...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • JS单例模式

    单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式是一种常用的模式,有一些对象我们往...

  • js 单例模式

    为何要有单例模式书中有举出一个实际场景,当我们点击登陆按钮时,页面中可能会出现一个弹框,而这个弹框是唯一的,无论点...

  • js单例模式

    概念:单例,指的就是只有一个实例的对象 var singleton = {name: 'singleton',me...

  • js单例模式

    单例模式 单例表示只存在一个这样的对象。单例模式是一种非常重要的设计模式,有很多经典的应用场景,比如说,网站的登录...

网友评论

      本文标题:JS 单例模式

      本文链接:https://www.haomeiwen.com/subject/sbzbyttx.html