单例模式:
定义:单例模式之所以这么叫,是因为它限制一个类只能有一个实例化对象。
实现方法:判断实例是否存在,如果存在则直接返回,如果不存在就创建了再返回。(确保一个类只有一个实例对象)
特点: 命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象
实现单例的方式
一丶对象字面量
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var hero = { name : "timo" sex : "male" method: function(){ console.log("提莫队长正在送命") } }
二丶添加私有成员和方法,然后使用闭包在内部封装这些变量
var hero = function(){ /*私有变量和方法*/ var word = '提莫队长正在送命' function tell(){ console.log(word) } 公有变量和方法 return{ told: function(){ tell(); }, dead: "Public string" } } var hero = hero() hero.told() //队长正在送命 console.log(hero.dead) //Public string
三丶如果我们想做到只有在使用的时候才初始化,构造函数初始化=>为了节约资源
var timo = (function(){ var inittimo; function init(){ /*定义单例*/ return { dead: function(){ console.log("Public dead") } word: "提莫队长正在送命" } } return { getinit: function(){ if(!inittimo){ inittimo = init() } return inittimo; } } })(); /*调用公有的方法来获取实例*/ timo.getinit().init()
单例模式的使用场景
系统间各种模式的通信协调上
var SingletonTester = (function () { //参数:传递给单例的一个参数集合 function Singleton(args) { //设置args变量为接收的参数或者为空(如果没有提供的话) var args = args || {}; //设置name参数 this.name = 'SingletonTester'; //设置pointX的值 this.pointX = args.pointX || 6; //从接收的参数里获取,或者设置为默认值 //设置pointY的值 this.pointY = args.pointY || 10; } //实例容器 var instance; var _static = { name: 'SingletonTester', //获取实例的方法 //返回Singleton的实例 getInstance: function (args) { if (instance === undefined) { instance = new Singleton(args); } return instance; } }; return _static; })(); var singletonTest = SingletonTester.getInstance({ pointX: 5 }); console.log(singletonTest.pointX); // 输出 5
我所理解的单例模式,相当于一个命名空间,可以管理代码库的各个模块,比如Vuex里的Module。还有jquery,也是封装好的一个单例。