单利模式

单例模式

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。一般使用在 线程池、全局缓存等方面。

单利模式的应用

  1. 普通单利模式

var Singleton = function (name) {
       this.name = name
       this.instance = null
   }
   Singleton.prototype.getName = function () {
       console.log(this.name)
   }
   
   Singleton.getInstance = function (name) {
       if(!this.instance){
           this.instance = new Singleton(name)
       }
   }
   var a = Singleton.getInstance('张三')
   var b = Singleton.getInstance('李四')
   alert(a === b) // true

   或者:
   var Singleton2 = function (name) {
           this.name = name
       }
       Singleton2.prototype.getName = function () {
           console.log(this.name)
       }
       
       Singleton2.getInstance = (function () {
           var instance = null;
           return function (name) {
               if(!instance){
               instance = new Singleton2(name)
               
               }
               return instance
           }
       })()
       var c = Singleton2.getInstance('张三')
       var d = Singleton2.getInstance('李四')
       alert(c === d) // true


       

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

  1. 透明单利模式
var Singleton = (function () {
       var instance = null 
       var Singleton = function (name) {
           if(instance){
               return instance
           }
           this.name = name
           this.init()
           return instance = this; 
       }
       Singleton.prototype.init = function () {
           this.getName()
           
       }
       Singleton.prototype.getName = function () {
           console.log(this.name)
           
       }
       return Singleton

    })()
    var a = new Singleton('张三')
    var b = new Singleton('李四')

总结:假设我们某天需要利用这个类从单例类变成 一个普通的可产生多个实例的类,那我们必须得改写 Singleton 构造函数,把控制创建唯一对象 的那一段去掉,这种修改会给我们带来不必要的烦恼

  1. 代理实现单例模式
var CreateDiv = function( html ){
        this.html = html;
        this.init(); 
    };

   CreateDiv.prototype.init = function(){
       var div = document.createElement( 'div' ); 
       div.innerHTML = this.html; 
       document.body.appendChild( div );
   };
   var ProxySingletonCreateDiv = (function(){
       var instance;
       return function( html ){
           if ( !instance ){
               instance = new CreateDiv( html );
           }
       return instance; 
       }
   })();

      4. 通用惰性单例模式

    // 1.我们可以通过变量存不存在来决定单例代码是否执行
    // 2.我们需要把不变的部分隔离出来,管理单例的逻辑从代码中抽离出来
    var Singleton = function (fn) {
        var instance;
        return function () {
            return instance||(instance=fn.apply(this,arguments))
        }
    }
   var CreateDiv = function (content) {
       var div = document.createElement('div')
       div.innerHTML = content
       document.body.appendChild( div );

       
   }
   var getSingleCreateDiv = Singleton(CreateDiv)

    getSingleCreateDiv('1111111')
posted @ 2019-05-17 14:00  纳齐尔  阅读(298)  评论(0编辑  收藏  举报