zoukankan      html  css  js  c++  java
  • 单利模式

    单例模式

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

    单利模式的应用

    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')
  • 相关阅读:
    采用二叉搜索树来统计文本中单词出现的频率
    一个表查找程序
    unix grep命令的大致实现
    字符串操作函数
    关于宏和逗号表达式
    http状态码的分类
    nginx源码学习资源(不断更新)转
    什么是CGI
    字符串操作 删除字符
    Ubuntu安装特定版本安装包
  • 原文地址:https://www.cnblogs.com/Paul-Yellow/p/10880956.html
Copyright © 2011-2022 走看看