JavaScript设计模式,单例模式!

单例设计模式:保证一个类仅有一个实例,并且提供一个访问它的全局访问点。有些对象只需要一个,这时可用单例模式。

传统的单例模式

  • 和new 创建对象的调用不一样
  • 调用者要调用xxx.getInstance才能获得该单例
function Singleton(name) {
    this.name = name;
}
Singleton.getInstance = function (name) {
    if(this.instace){
        return this.instace;
    }else {
        this.instace = new Singleton(name);
        return this.instace;
    }
};
var a = Singleton.getInstance('a');
var b = Singleton.getInstance('b');
console.log(a===b); //true

"透明"的单例模式

  • "透明"的单例类,用户从这个类中创建对象的时候,可以像使用其他任何普通类一样
  • 直接 new 一个对象
  • 不能new 多个对象,扩展性不好
var instace;
function Person(name) {
    this.name = name;
    if (!instace) {
        instace = this;
    }
    return instace;
}

Person.prototype.getName = function () {
    console.log(this.name);
};
var a = new Person('a');
var b = new Person('b');
console.log(a===b);

 

代理模式创建单例模式

  • 代理模式:自己不去做,委托中间人做
  • Person是一个普通类,通过new Person可以创建一个对象
  • 用代理模式创建CreateSinglePerson方法,通过new CreateSinglePerson可以创建一个单例

 

JavaScript中的单例模式

  • 单例模式的核心是确保只有一个实例,并提供全局访问
  • 在JavaScript可以通过直接创建一个对象来实现单例模式
  • 可以用闭包的方式实现私有变量
let MyApp = {
    name: 'app',
    getName: function () {
        console.log(this.name);
    }
};
let MyApp2 = (function () {
    var _name = 'app';
    return {
        getName: function () {
            console.log(_name);
        }
    }
})();

 

小结

单例模式用到了闭包和高阶函数的特性。单例模式是简单但常用到的模式,比如单页应用、websocket连接等等。创建对象和管理单例的职责分布在不同的方法中,方便扩展和管理。

posted @ 2020-06-11 09:53  Magi黄元  阅读(392)  评论(0编辑  收藏  举报