设计模式(一):单例模式
2018-11-06 本文已影响0人
月肃生
单例模式
保证一个类仅有一个实例,提供访问入口。
实现单例模式
创建一个类,通过getInstance
来获取对象
var Singleton = function (name) {
this.name = name
}
Singleton.prototype.getName = function() {
alert(this.name)
}
// 将单例对象绑定在类上面
Singleton.getInstance = function(name) {
if(!this.instance){
this.instance = new Singleton(name)
}
return this.instance
}
// 或者通过匿名函数创建
Singleton.getInstance = (function(){
var instance = null
return function(name) {
if(!this.instance){
this.instance = new Singleton(name)
}
return this.instance
}
})()
```var Singleton= (function() {
var instance
return function(name){
if(instance) {
return instance
}
this.name = name
return instance=this
}
})()
但是有个缺点,Java通过将构造函数私有化实现单例,而上面的例子中仍可通过new Singleton()
获得实例。
改进
var Singleton= (function() {
var instance
return function Single(name){
if(instance) {
return instance
}
this.name = name
return instance=this
}
})()
通过匿名函数创建对象,但是这个Single
有点奇怪,准确来说并不是一个类(有返回值),只是一个函数。
代理实现单例
function Singleton(name){
if(instance) {
return instance
}
this.name = name
return instance=this
}
var ProxySingleton = (function() {
var instance
return function (name){
if(!instance) {
instance = new Singleton(name)
}
return instance
}
})()
通过代理实现单例,Singleton
本身没有变化,只是通过代理获取对象。
总结
准确来说,单例模式只是Java中存在的,因为Java是类为基础的,所有对象都是类的实例,而在JavaScript则是一切皆对象,全局对象也可以看做是一种单例,实现单例只是一种模仿。