JavaScript设计模式---单例模式

单例模式


/**
 * 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
 * 有一些对象往往只需要一个,比如全局缓存、线程池、浏览器中的window对象
 * 例如;单击登录弹出一个登录悬浮窗,这个悬浮窗就是唯一的,无论点击按钮多少次,只会创建一次,适合用单例模式创建
 */
// 简单的单例模式
function Singleton(name) {
	this.name = name;
	this.instance = null;
}
Singleton.getInstance = function(name) {
	if(!this.instance) {
		this.instance = new Singleton(name); 
	}
	return this.instance;
}
let a = Singleton.getInstance('singleton1');
let b = Singleton.getInstance('singleton2');
console.log(a === b); // true

// 使用闭包方式
function Singleton1(name) {
	this.name = name;
}
Singleton1.getInstance = (function() {
	let instance = null;
	return function(name) {
		if(!instance) {
			instance = new Singleton1(name);
		}
		return instance;
	};
})();
let c = Singleton1.getInstance('singleton3');
let d = Singleton1.getInstance('singleton4');
console.log(c === d); // true

// 用代理实现的单例模式
function Singleton2(name) {
	this.name = name;
}
const ProxySingleton2 = (function() {
	let instance = null;
	return function(name) {
		if(!instance) {
			instance = new Singleton2(name);
		}
		return instance;
	};
})();
let e = new ProxySingleton2('singleton5');
let f = new ProxySingleton2('singleton6');
console.log(e === f); // true

/**
 * JavaScript中的单例模式
 * 单例模式的核心是 确保只有一个实例,并提供给全局访问。
 * 在JavaScript中全局变量就是唯一的,并且也能全局访问;但全局变量不是单例模式,只是会经常当作单例来使用。
 * 但是在开发中全局变量有冲突可能性,所以要减少全局变量的使用。
 */
// 使用命名空间来减少全局变量数量
// 1.使用对象字面量方式
const NAME_SPACE = {
	a: function() {
		console.log('a');
	},
	b: function() {
		console.log('b');
	}
};
// 2.动态创建命名空间
const ROOT = {};
ROOT.nameSpace = function(name) {
	const partName = name.split('.');
	let current = ROOT;
	for(let i in partName) {
		if(!current[partName[i]]) {
			current[partName[i]] = {};
		}
		current = current[partName[i]];
	}
};
ROOT.nameSpace('desktop');
ROOT.nameSpace('doc.weiwl');
console.dir(ROOT); // { desktop: {}, doc: { weiwl: {} } }
// 2.使用闭包封装私有变量 暴露接口与外界通信
const user = (function() {
	let _name = 'weiwl', _age = 18;
	return {
		getUserInfo: function() {
			return _name + '-' + _age;
		}
	};
})();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值