title:设计模式之——单例模式
categories:tech
tag:[设计模式,编程]
模式名称
所谓单例,即整个系统中只存在某个类的一个单一实例。
解决的问题(应用场景)
单例模式是一种比较常见的设计模式,它也被应用在许多场景,它能够解决如下问题:
-
命名空间管理:可以将一组有关联的属性和方法封装到一个单例中,方便命名管理,防止这些方法属性和其他类的实例的方法属性发生命名冲突。
-
资源共享,由于有些实例的内存损耗比较大,一旦有多个实例,内存损耗就会非常严重,这时候,就可以使用单例模式来保证实例的唯一性,即每次调用和创建实例返回的都是内存中的同一个实例。
-
保证实例的唯一性:有些实例整个系统中只能存在一个,否则会引起同步问题和操作冲突,这时就应该使用单例模式。
常见的应用场景:
- windows的任务管理器就是一个单例,整个系统中只有这一个管理器实例,不可能有两个。(保证实例的唯一性)
- jquery库的jquery包装对象本身就是一个单例。(命名空间管理)
- 网站的计数器(资源共享)
- 数据库连接池。(资源共享)
- 操作系统的文件系统(保证实例的唯一性)
解决方案
在实例化的时候检查是否已经存在该类的一个实例,如果存在,直接返回,如果不存在,才创建返回新实例。
代码示例(javascript):
var Singleton = (function () {
var instantiated;
function init() {
/*这里定义单例代码*/
return {
publicMethod: function () {
console.log('hello world');
},
publicProperty: 'test'
};
}
return {
getInstance: function () {
if (!instantiated) {
instantiated = init();
}
return instantiated;
}
};
})();
/*调用公有的方法来获取实例:*/
Singleton.getInstance().publicMethod();
}
效果
在不使用单例模式的情况下,对一个类实例化多次,内存中就会存在多个实例,损耗会非常大,使用了单例模式以后,内存中只存在该类的一个实例,损耗就在可控范围内。另外一方面,每一个单例有独立的命名空间,整个系统的命名系统也变得很有秩序。