JS设计模式之单例模式
单例模式
单例模式的定义是:保证一个类只有一个实例,并提供一个访问它的全局访问点。比如说购物车,在一个商城中,我们只需要一个购物车,购物车在整个商城中是唯一的,不需要多次创建,即使多次点击购物车按钮,也不会生成多个购物车。
闭包预警:有对闭包不明白的同学,可以看这里。
让我们实现一个单例模式吧
var Singleton = function(name) {
this.name = name;
}
Singleton.getInstance = (function () {
var instance = null;
return function (name) {
if (!instance) {
instance = new Singleton(name);
}
return instance;
}
})()
var single1 = Singleton.getInstance('张三');
var single2 = Singleton.getInstance('李四');
console.log(single1 === single2); // 输出true
我们主要看一下Singleton.getInstance
方法,其中将变量instance
作为一个标志,来确认是否创建过Singleton
对象。如果没有就创建一个Singleton
对象,反之则返回之前创建过的对象。
这样我们创建Singleton
对象的时候,就得使用Singleton.getInstance
方法,而不是使用new
关键字来创建对象。如果想使用new
关键字的话,可以这样写。
使用代理类来实现单例模式
var Singleton = function(name) {
this.name = name;
}
var ProxySingleton = (function () {
var instance = null;
return function(name) {
if (!instance) {
instance = new Singleton(name);
}
return instance;
}
})()
var single1 = new ProxySingleton('张三');
var single2 = new ProxySingleton('李四');
console.log(single1 === single2); // 输出true
我们将管理单例的逻辑放入ProxySingleton
这个代理类中,从而使Singleton
变成一个普通的类或者构造函数。这样我们就可以通过new
关键字来创建对象。
创建对象和管理单例逻辑职责分离
var createObj = function(name, age) {
return {
name: name,
age: age
}
}
var getSingle = function(fn) {
var instance = null;
return function () {
return instance || (instance = fn.apply(this, arguments));
}
}
var CreateFn = getSingle(createObj);
var obj1 = CreateFn('张三', 18);
var obj2 = CreateFn('李四', 19);
console.log(obj1 === obj2); // 输出true
这里createObj
方法负责创建对象和处理内部逻辑,getSingle
方法只负责管理单例的逻辑。这样在创建各种单例对象的情况下,使用更加灵活。也符合单一职责的开发原则。
单例模式的使用场景
单例模式的使用场景非常广泛,这里举几个
JS设计模式之单例模式的更多相关文章
- [JS设计模式]:单例模式(1)
什么是单例模式 所谓单例,就是一个类只有一个实例,实现的方法一般是先判断是否存在实例,如果存在就直接返回,如果不存在就创建了再返回.这样确保了一个类只有一个实例对象. 实现的单例有很多种方式,最简单的 ...
- js设计模式总结-单例模式
单例模式 解决的问题 保证实例只有一个,避免多个实现,从全局来看,这个实例的状态是唯一的. 实现原理 设置一个变量来记录实例,通过检测该变量是否为空来决定是否创建实例 非透明单例 所谓非透明就是用户在 ...
- JS设计模式之---单例模式
单例模式是保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式在现在面向对象的语言Java,C#,C++等等中也有很多用到,其实它在Javascript中使用同样非常广泛. var Cre ...
- JS 设计模式二 -- 单例模式
单例模式 概念 单例模式 就是保证一个类只有一个实例,并提供一个访问它的全局访问点. 实现方法 先判断实例是否存在,如果存在直接返回,如果不存在就创建实例后在返回,确保了一个类只有一个实例对象. va ...
- 浅谈js设计模式之单例模式
单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器中的 window 对象等.在 JavaS ...
- JS设计模式之单例模式(一)
单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这 就确保了一个类只有一个实例对象. 在JavaScript里,实现单例的方式有很多种, ...
- Js常用的设计模式(1)——单例模式
<Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通 ...
- JS设计模式(一)
刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ...
- js设计模式总结1
js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ...
随机推荐
- js实现回到顶部操作
<a href="javascript:;" id="btn" title="回到顶部"></a> 样式: #btn ...
- RabbitMQ通过Exchange.fanout、不同的队列绑定同一个Exchange实现多播处理
消费者1: static void Main(string[] args) { ConnectionFactory factory = new ConnectionFactory() { HostNa ...
- SOUI中TaskLoop组件介绍
SOUI是一套开源(MIT协议)的Windows平台下的DirectUI框架,它提供了大量的高效控件,也提供了很多扩展组件,目前已经持续维护近10年,在大量的项目中证明稳定可靠. GIT地址: 国内: ...
- react native 项目版本升级
首先说明一下rn项目的一种相当顺滑升级方法: 1.全局安装react-native-git-upgrade npm i -g react-native-git-upgrade 2. 在项目目录下执行命 ...
- flink连接hbase方法及遇到的问题
1.继承 RichSinkFunction 类 mvn配置: <dependency> <groupId>org.apache.flink</groupId> &l ...
- C语言作业06--结构体&文件
1.本章学习总结 1.1 思维导图 1.2学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.定义结构体可以使代码整个练习更加紧密,非常实用,当我们需要在对一个个体的不同属性调用时可以更加系统 ...
- java笔记(Idea,Maven):误删maven项目的target的class,怎么再生成target
右边侧边栏clean一下,target目录删掉了.或是手动删掉了.再建. 跑一下 Tomcat. target自动生成. 就这样.:)
- html动画实现
1.目标动图 2.主要代码 <p><img src="http://img.baidu.com/hi/jx2/j_0043.gif"/><img sr ...
- <算法图解>读书笔记:第4章 快速排序
第4章 快速排序 4.1 分而治之 "分而治之"( Divide and conquer)方法(又称"分治术") ,是有效算法设计中普遍采用的一种技术. 所谓& ...
- RSP小组——消消乐
RSP小组--消消乐 团队所有博客总结 1.团队第一周作业 2.团队第二周作业 3.RSP小组--团队冲刺博客一 4.RSP小组--团队冲刺博客二 5.RSP小组--团队冲刺博客三 6.RSP小组-- ...