在大学时候有门专业课叫设计模式,都是些纯理论的东西,当时只是死记硬背了因为没有实际工作过并不完全理解(当时想代码还可以这样玩?!还有数据结构那些烧脑的东西) 那么设计模式到底是什么呢? 定义:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 一句话通俗点讲就是一套前辈们设计代码的经验的总结,开发中合理的运用设计模式可以巧妙的解决很多问题。使用设计模式的目的为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。如同网友所说“抱着'代码虐我千百遍,我待代码如初恋'的心态,最终得出来的'套路'”。 之所以是写代码的“套路”,那么设计模式是通用的并不属于和局限于某种语言,和数据结构一样是程序的思想,每个语言都可以实现只是根据语言特性的不同在实现手法上略有差异。
1. 定义:保证一个类有且只有一个实例,并提供访问此实例的全局访问点。 2. 特点:单例模式属于创建型设计模式。顾名思义,单例就是单一的意思, 只有一个实例; 对外(全局)提供可访问此实例的接口; 内部自行实例化 ; 在需要时才创建(惰性单例)。 3.UML图:
4. 应用场景: (1)在OS领域我们常见的Windows任务管理器就是很典型的单例模式,试想一下能打开几个任务管理器呢?当然只有一个。 (2)在后端DB领域,为了节省频繁的访问数据库连接所引起的效率损耗,数据库系统被引入数据库连接池,用单例模式来设计,这样很大程度上降低这种资源的消耗。还有在Java开发中的多线程的线程池等。 (3)在web前端领域,当点击登录按钮弹出一个登录框,即使多次重复点击也只会出现一次登录框,这个登录弹框组件就采用单例模式实现。 (4)在项目中引入插件或库时,重复多次加载库文件时,全局只会实例化一个对象。 In Summary: 单例模式一般应用在资源共享和资源之间的互相通信,节约资源和空间的浪费。5. 实现思路:先判断实例是否存在,如果存在则返回;如果不存先创建再返回,这样就确保了一个类只有一个实例对象。
6. JavaScript单例模式
ES5实现
var SingleDog = (function() { var instance = null; //构造函数 function SingleDog(args) { this.args = args; } //判断实例 return function(args){ if (!instance) { instance = new SingleDog(args); } return instance; }; })(); var Jack = new SingleDog('Jack'); var Tom = new SingleDog('Tom'); console.log( Jack === Tom ); // true改进以复用
//构造函数提出来可提供不同的 var SingleDog = function(args) { this.args = args; }; //单例体 var Single = function(Obj) { var instance = null; return function() { if (!instance) { instance = new Obj(arguments); } return instance; }; }; var Dog = Single(SingleDog); var Jack = new Dog('Jack'); var Tom = new Dog('Tom'); var Mark = new Dog('Mark'); console.log( Jack === Mark && Tom === Mark && Jack === Tom ); //trueES6实现
class SingleDog { //构造方法 constructor(name) { this.name = name; } //静态方法 static getInstance(name) { if(!this.instance) { this.instance = new SingleDog(name); } return this.instance; } } let Tom = SingleDog.getInstance('Tom'); let Jack = SingleDog.getInstance('Jack'); console.log(Tom === Jack); //true单例模式还分为懒汉式和饿汉式,以上为懒汉式(个人喜好)较常用
参考文献:
汤姆大叔《深入理解JavaScript系列》
《JavaScript 设计模式与开发实践》
