对Javascript系列(25)的深入理解:设计模式的单一模式详细解决方案
介绍从这一章中,我们将介绍各种设计模式在Javascript中一步一步实现的,在这里我就不多介绍模式本身的理论,而只注重implementation.ok,正式启动。
在传统的开发工程师的眼睛,单是确保一个类只有一个实例的方法,一般是首先判断是否存在,如果你有一个直接的回报,如果不存在创造回报,这将确保一个类只有一个实例对象的。Javascript,一个简单的例子提供了一个独特的接入点从全局命名空间访问对象作为一个名称空间提供商。
文本
在Javascript中,有许多方法来实现单。最简单的方法之一是使用对象文字方法,它可以包含大量的属性和方法。
复制代码代码如下所示:
VaR MySingleton = { {
Property1: something
财产:什么
方法:函数(){
console.log('Hello World);
}
};
如果您想以后扩展对象,您可以添加自己的私有成员和方法,然后使用闭包来封装其内部的变量和函数声明,只公开要公开的public成员和方法,示例代码如下所示:
复制代码代码如下所示:
VaR MySingleton =函数(){()
这个语句/私有变量和方法。
无功privatevariable =私人的;
功能showprivate(){
console.log(privatevariable);
}
*公共变量和方法(可以访问私有变量和方法)。
返回{
publicmethod:函数(){
showprivate();
},
publicvar:公众可以看到这个!
};
};
VaR单= MySingleton();
single.publicmethod(私人的); / /输出
console.log(单。publicvar); / /公众可以看到output'the这个!
上面的代码是好的,但是如果我们想在使用它的时候怎么做呢为了节省资源,我们可以在另一个构造函数中初始化代码,如下所示:
复制代码代码如下所示:
Var Singleton =(函数(){())
VaR的实例化;
函数init(){
这里是一个单例代码的定义
返回{
publicmethod:函数(){
console.log('Hello World);
},
公共财产:测试
};
}
返回{
getInstance(){:功能
如果(!实例化){
实例化= init();
}
返回实例化;
}
};
});
获取公用调用的方法:
singleton.getinstance()PublicMethod();
我知道一个例子是怎么做的,但是哪种场景更适合一个例子呢事实上,单个示例通常用于系统间各种模式的通信协调。下面的代码是一个示例的最佳实践。
复制代码代码如下所示:
Var SingletonTester =(函数(){()
参数:传递到一组参数的情况下
函数的Singleton(args){
/ /设置参数变量对接收的参数或零(若适用)
var args =参数| | { };
设置参数
this.name = 'singletontester;
/ /套的pointx价值
this.pointx = args.pointx 6 | |; / /从接收到的参数,或者设置为默认值
/ /套的尖尖的价值
this.pointy = args.pointy | | 10;
}
实例容器
VaR的实例;
无功_static = { {
名称:'singletontester,
例如方法
返回单个实例的实例
提供:功能(args){
如果(实例=未定义的){
实例=新单(args);
}
返回实例;
}
};
返回_static;
});
无功singletontest = singletontester.getinstance({ 5 } pointx:);
console.log(singletontest。pointx); / /输出5
其他的实现
方法1:
复制代码代码如下所示:
函数宇宙(){
确定是否有示例
如果(typeof universe.instance = 'object){
返回universe.instance;
}
其他内容
this.start_time = 0;
this.bang =大;
缓存
这universe.instance =;
隐式返回
}
测试
新宇宙();
无功uni2 =新宇宙();
console.log(UNI = uni2); / /真的
方法2:
复制代码代码如下所示:
函数宇宙(){
缓存实例
var实例;
其他内容
this.start_time = 0;
this.bang =大;
重写构造函数
(宇宙=函数){
返回实例;
};
}
测试
新宇宙();
无功uni2 =新宇宙();
uni.bang =123;
console.log(UNI = uni2); / /真的
console.log(uni2。爆炸); / / 123
方法3:
复制代码代码如下所示:
函数宇宙(){
缓存实例
VaR的实例;
重新构建构造函数
宇宙=函数宇宙(){
返回实例;
};
后处理原型属性
这universe.prototype =;
例
实例=新宇宙();
构造函数重置指针
instance.constructor =宇宙;
其他功能
instance.start_time = 0;
instance.bang =大;
返回实例;
}
测试
新宇宙();
无功uni2 =新宇宙();
console.log(UNI = uni2); / /真的
添加属性原型
universe.prototype.nothing =真;
新宇宙();
universe.prototype.everything =真;
无功uni2 =新宇宙();
console.log(UNI。没有); / /真的
console.log(uni2。没有); / /真的
console.log(UNI。一切); / /真的
console.log(uni2。一切); / /真的
console.log(uni.constructor =宇宙); / /真的
模式4:
复制代码代码如下所示:
VaR的宇宙;
(函数(){())
VaR的实例;
宇宙=函数宇宙(){
如果(实例){
返回实例;
}
实例=;
其他内容
this.start_time = 0;
this.bang =大;
};
}();
测试代码
新宇宙();
新宇宙();
警报(a = b);
a.bang =123;
警报(b.bang); / / 123