理解js设计模式之单例模式

单例模式的定义:只提供唯一的一个实例来让你访问

js中单例是天然存在的:

var a1={
  hello:‘js‘
}
var a2={
  hello:‘js‘
}
console.log(a1===a2) //false

  任意生成的一个对象字面量其实就是一个对象而且他也是唯一的,对象字面量声明对象的方式,每次都会在对内存中创建一个新的空间,所以不管你对象里面的东西一不一样,他们就是不一样的(本质是地址不一样)

但是这样的单例是不可靠的,很容易被覆盖。。。你将a1,a2赋一个新的值,之前的单例对象就被垃圾回收了

如何生成可靠的单例?    用js的闭包可以很容易的做到这一点

var Singleton=function(name){
    this.name=name;
}

Singleton.prototype.getName=function(){
    return this.name;
}
Singleton.getInstance=(function(){
   var instance=null;
   return function(name){
    if(!instance)  return instance=new Singleton(name);
     return instance;
   }
})()

var one=Singleton.getInstance(‘I am first one‘);
var two=Singleton.getInstance(‘I am second one‘);

console.log(one===two);   //true
console.log(one);
console.log(two);

  

这样就完成了一个简单的单例模式,书上将这种写法称为 ‘不透明’ 的单例模式,因为生成一个单例要通过  Singleton.getInstance 这个方法来获得,不能像正常创建对象那样,也就是new Singleton() 这样,这种称为 ‘透明’ 的单例模式;

然而,其实单例模式的实现方式上:就是维护一个可访问的变量,来标志是否已经生成了一个实例了,如果生成了就将他返回,没有生成就创建一个,保存起来

那么,闭包的优势又体现出来了:

var Singleton=(function(){
   var instance=null;
   function SingletonHelper(name){
       if(instance) return instance;
       this.name=name;
       return instance=this;  //将第一个new 产生的对象保存在instance 下一个new 要去生成的时候就会返回这个实例
   }
   SingletonHelper.prototype.getName=function(){
     return this.name;
   }
   return SingletonHelper;
})()

var one=new Singleton(‘I am first one‘);
var two= new Singleton(‘I am second one‘);

console.log(one);
console.log(two);
console.log(one===two);

  这样就可以正常的去new 一些对象,而且不管你new 几个,结果都是一样的,都是第一个生成的那个对象

时间: 2024-10-12 03:49:55

理解js设计模式之单例模式的相关文章

js设计模式之单例模式

关于设计模式,我的理解是它是业务代码的提前解决方案.意思就是说在没有真正的业务之前,设计模式就存在了,这个是显然的.设计模式是人长期从事业务总结的具有普通适用性的解决方案. 就个人来讲,写了太多的命令式编程代码,所谓命令式代码就是业务需要怎样就写怎么样的功能,比如添加一个点击事件,比如进行一个验证等扥.写就写了很少站在设计模式的角度或者前人的角度去改善代码. 不给自己找客观原因,最近开始关注设计模式,尝试从设计模式的角度改善开发. 在开始单例设计模式之前首先要搞清楚js之中的apply和call

js设计模式学习 --- 单例模式1

什么单例模式 定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器中的window 对象等.在JavaScript 开发中,单例模式的用途同样非常广泛.试想一下,当我们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建. 实现单例模式 <script type="text/javascrip

理解js设计模式之策略模式

策略模式的定义:定义一系列的算法,然后根据实际情况去调用 一个小插曲:最近在项目的过程中接手了一个比较复杂的需求,由于是旧的项目用新的框架重构,所以能够看见以前的代码,吸取下前人代码的精华,复用一些可用的代码,免得自己写半天..当然这篇的主题是策略模式,不会离题,因为当我完成了Version 1 后,项目里面大量的if-else 字段的验证都放在一个函数里面,而且不同字段有些还会相互影响,导致代码很长很乱大概有几十行的if else ,丝毫没有条理:这个时候,需要去重构这个原本的底层验证函数,那

JS 设计模式之单例模式

?一.概念: 一个类 仅有一个实例 提供一个访问它的全局访问点 ?二.实现: class SimpleOne { constructor (name) { this.name = name; } getName (propsName) { this.name = propsName; return typeof this.name; } } const a = new SimpleOne('a').getName(); const b = new SimpleOne('b').getName()

Js常用的设计模式(1)——单例模式

<Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言.每种语言都有天生的优缺点.一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些. 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬. 换到程序中, 静态语言里可能需要花很多功夫来实现装饰

【转】JS设计模式开篇

(原文地址:http://blog.chinaunix.net/uid-26672038-id-3904513.html) 本文主要讲述一下,什么是设计模式(Design pattern),作为敲键盘的我们要如何学习设计模式.设计模式真的是一把万能钥匙么? 各个代码的设计模式几乎每个人都知晓,就算不会那也一定在一些装逼的大牛(部分而已)口中听过.但可能很少有人知道设计模式的由来: 设计模式该术语源自Erich Gamma等人在上世纪90年代从建筑设计领域引入到计算机科学的(很难想象到底有多大关联

JS设计模式(一)

刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化.linux.数据库.服务器等的基础知识. 设计模式的学习主要参考<JavaScript设计模式与开发实践>一书,很多笔记也会从该书抄录.开始JS设计模式的学习. 1.原型模式 原型模式既是一种设计模式,也是一种编程泛型.原型模式是JS最基础的继承实现,在这儿就不多讲了,写一下JS原型继承的基本原

[转]JAVA设计模式之单例模式

原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话

C#设计模式(1)——单例模式

一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考.首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二.单例模式的介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只