欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单利模式

程序员文章站 2022-07-04 08:44:42
...

单例模式

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

单利模式的应用

  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')

上一篇: Linq查询

下一篇: LINQ查询