美文网首页
2.设计模式(单例模式)

2.设计模式(单例模式)

作者: 悠哈121 | 来源:发表于2020-11-04 11:05 被阅读0次

1.单例模式:保证一个类仅有一个实例,并且提供一个访问它的全局访问点(比如window,js中的登录窗口)

代码实现(1.增加类的不透明性,Singleton类的使用者必须知道这是一个单例类,跟以往new xxx的方式不同)
var Singleton = function( name ){ 
  this.name = name; 
 }; 
 Singleton.getInstance = (function( name ){ 
  var instance = null
  return function(name){
    if(!instance){
      console.log("xxx") //只会打印一次 
      instance = new Singleton(name)
    }
    return instance
  }
 })(); 
 var a = Singleton.getInstance( 'sven1' ); 
 var b = Singleton.getInstance( 'sven2' );
 console.log(a === b) //true
代码实现(2.实现透明的单例类,为了把instance封装起来,我们使用了自执行的匿名函数和闭包,并且让这个匿名函数返回真正的Singleton方法,增加程序的复杂度,如果我们有一天需要利用这个类创建很多不同的对象,则要将判断地方注释掉)
var Singleton = (function(){
  var instance = null;
  return function(name){
    if(!instance){
      this.name = name;
      console.log("xxx")
      return instance = this
    }
    return instance;
  }
})()
var a = new Singleton("A")
var b = new Singleton("B")
console.log(a === b,a.name) //true
代码实现(3.用代理实现单例模式,我们把负责管理单例的逻辑已到了代理类总,这样Singleton就i变成了一个普通类)
function Singleton(name){
 this.name = name;
}
var proSingleton = (function(){
  var instance = null;
  return function(name){
    if(!instance){
      console.log("xxx")
      instance = new Singleton(name);
    }
    return instance
  }
})()
var a = new proSingleton("A")
var b = new proSingleton("B")
console.log(a === b) //true

js中的单例模式:js是一门无类的语言,全局变量不是单例模式,但在js开发中,经常会把全局变量当成单例使用例如 var a={},全局变量容易造成命名空间的污染

代码实现
1.使用命名空间
var namespace={
  a:function(){}
}
2.使用闭包封装私有变量
let p = (function(){
  let _name = "hahaha"
  return {
    getName:function(){
      console.log(_name) //hahaha
    }
  }
})()
p.getName()

2.惰性单例:在需要的时候创建,而不是在页面加载好创建,比如第一部分内容所讲,再比如webqq登录窗口,点击qq头像,会弹出一个登录窗,这个浮窗在页面是唯一的,两种解决方案:1.一开始浮窗隐藏,用户点击登录的时候开始显示,这种方式有一个缺点就是在我们没有进行登录的时候,dom节点已经被创建好,可能白白浪费了dom节点,2.在单击按钮的时候再去创建登录窗口,但此时会引起dom被重复创建,于是引入一个变量判断是否创建过登录窗口

代码实现(最好把创建对象和管理单例逻辑分开,以下代码没有分开)
var createLoginLayer = (function(){ 
 var div; 
 return function(){ 
 if ( !div ){ 
 div = document.createElement( 'div' ); 
 div.innerHTML = '我是登录浮窗'; 
 div.style.display = 'none'; 
 document.body.appendChild( div ); 
 } 
 return div; 
 } 
})();
document.getElementById( 'loginBtn' ).onclick = function(){ 
 var loginLayer = createLoginLayer(); 
 loginLayer.style.display = 'block'; 
};

相关文章

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • 设计模式之一:单例模式

    摘要:设计模式之一:单例模式目录介绍1.单例模式介绍2.单例模式定义3.单例模式使用场景4.单例模式的实现方式 4...

  • 设计模式(Swift) - 3.观察者模式、建造者模式

    上一篇 设计模式(Swift) - 2.单例模式、备忘录模式和策略模式中讲了三种常见的设计模式. 单例模式: 限制...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 23设计模式之一

    简述 一、设计模式的六大原则 二、23种设计模式 1.单例模式 懒汉式单例 饿汉单例 2.三种工厂模式 1>.简单...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

网友评论

      本文标题:2.设计模式(单例模式)

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