每日一节设计模式(1) —— 创建型设计模式之单例模式

202 阅读4分钟

大家好!让编码更加有趣,让生活更有逻辑,我是星球小顽童,欢迎来到我的世界,和我一起玩转星球!

创建型设计模式是一类处理对象创建的设计模式,通过某种方式控制基本对象的创建来避免基本对象创建时可能导致的设计上的问题或增加设计的复杂度。

单例模式又叫单体模式,是只允许实例化一次的对象类。单例模式有三种典型的应用场景,下面来一一举例:

1. 单例模式三驾马车之命名空间的管理员:

比如我们有这样一个需求:

var xiaoCai = {
	// 通过Id获取Dom元素
	getEleById: fucntion(id) {
		return document.getElementById(id)
	   },
	// 设置元素样式
	setStyle: function(id, key, value) {
	      this.getEleById(id).style[key] = value
	   }
	}

我们还可以更进一步,用单例给我们的代码进行模块划分以建立自己的代码仓库,比如对dom的增删改查放入dom模块,对元素进行事件监听可以放入listener模块:

var xiaoCai = {
	listen: {
		click(id) {
		    document.getElementById(id).addEventListener('click', () => {
				// do something
			})
		},
		input(id) {
			document.getElementById(id).addEventListener('input', () => {
				// do something
			})
		}
	},
	dom: {
	     // ...
	}
}

“那么我们使用的时候就可以这样写了。”

xiaoCai.listen.click('guaWaZi')...

小结: 这就相当于“瓜娃子1”去银行开设了一个私人账户“瓜娃子”,所有的理财业务啥的都绑定在这个账户上,这时候“瓜娃子2”也去银行开设私人账户“瓜娃子”,然后被银行告知不允许使用这个账户名称,因为之前已经有人使用了这个账户。而且所有的业务都绑定在一个唯一的账户下面还有一个好处就是更好管理和维护。

2. 单例模式三驾马车之管理静态变量:

在有些业务场景下,我们需要对一些变量设置为只可读取。而js又是没有static关键字的,理论上任何变量都可以更改。基于静态变量只能访问不能修改并且创建后就可以使用这个特点,我们想到了一个good idea: 能访问的变量定义方式有很多,在全局作用域下或者级作用域({}内)如函数内部定义一个特权方法来get it, 我们可以只抛出get变量的方法就可以实现我们的目的。但还有最后一个问题就是我们放在函数内部的变量还能供外界访问,为实现创建后就能使用这个需求,就需要让我们创建的函数执行一次并关闭其它对外访问入口,至此,我们创建的对象内保存的静态变量就可以通过取值器进行访问咯,这就是一个管理静态变量供他人使用的全局单例对象!

const Conf = (function() {
		// 定义私有变量
		const conf = {
			MAX_AGE: 150,
			MIN_AGE: 1,
			COUNT: 9999
		}
		// 返回取值器对象
		return {
			// 取值器方法
			get: function(name) {
				return conf[name] ? conf[name] : null;
			}
		}
	})();

既然没有赋值器,我们就不能进行写操作了,这样就可以进行使用了: const count = Conf.get(‘COUNT’)。

小结: 静态变量就相当于是你办理的银行定期存折,你只能看看过过眼瘾,不能够取钱出来花,否则你老婆就会让你跪榴莲。

3. 单例模式三驾马车之惰性单例:

有时需要延迟创建我们的单例对象,也有人称为“惰性创建”!

const LzaySingle = ()(() => {
	const instance = null;
	function Single() {
		return {
			publishMth: function() {},
			publicProp: 'good'
		}
	}
	return function() {
		if(!instance) { // 判断
			instance = Single() // 赋值
		}
		return instance
	}
})

一句话,就是通过增加判断、赋值的过程来实现延迟单例创建的。 console.log(LzaySingle().publicProp) // good

小结: 惰性单例就像是你去银行办理风险理财业务,中间要经过一系列的投资心理测评、各种签协议啥的才能给你开户。

总结:

  1. 核心优势:通过单例模式可以将各个模块的代码井井有条地梳理在一起。
  2. 适用场景:如果你想让你的系统中只存在一个对象,那么单例模式则为最佳实践。