在Javascript中,单例
模式是最基本和
经常使用的设计模式之一,它可能不经意地用于单模式。
本文从最基本的理论入手,描述了单案例模型的基本概念和实现
方法。最后,用一个例子来描述单案例模型的应用。
理论基础
概念
单例,顾名思义,就是只有一个实例存在。通过单例模式,一类
系统可以保证只有一个实例,并且实例很容易被外部访问,便于
控制实例的数量,节省系统资源。如果只有一个对象的类的系统中,单例模式是最佳的
解决方案。
基本结构
最简单的单模式开始是对象文字,它由相关的
属性和方法组织在一起。
var
道具:值
方法:
函数(){
}
}
这种形式的单例模式,所有成员
都是开放的,可以通过单例访问,缺点是一些辅助方法在单个
情况下不想暴露给
用户。如果用户使用这些方法,则在后面
维护时会
删除一些辅助方法,这将导致
程序错误。
如何避免这样的错误
包含私有成员的单模式
我们如何在课堂上
创建私人成员这是通过
关闭来实现的。本文没有提到闭包的知识。你可以做着自己。
基本形式如下:
var =(函数()){()
无功privatevar =私人;
返回{
道具:值
方法:函数(){
console.log(privatevar);
}
}
});
第一个是匿名函数,它是自
执行的。在匿名函数,变量privatevar宣告,和一个对象被分配到单个对象单一,privatevar变量不能在匿名函数访问。它是单个实例的私有变量,只能在函数内部或通过公开的方法访问。
惰性实例化
无论是直接的文字或私有成员的单例模式,他们都挑出来当
脚本被加载,但有时,
网页可能无法使用单例对象,这会造成资源的浪费。在这种情况下,解决这个问题的最好办法是惰性加载,,也就是说,当我们需要它,我们真的可以实例化对象。
var =(函数()){()
函数init(){
无功privatevar =私人;
返回{
道具:值
方法:函数(){
console.log(privatevar);
}
}
}
var实例= null;
返回{
getInstance(){:
功能 如果(!实例){
实例= init();
}
返回实例;
}
}
});
首先,创建init对象的代码封装在init函数中,然后声明一个私有变量实例,它代表单例对象的实例。它提供了一种方法getInstance获得对象。
电话被singleton.getinstance(),和单一的对象实际上是创建时调用getInstance。
应用
单例模式是js中最常用的设计模式,它应该尽可能地从增强模块化和代码组织的方面使用,它可以组织相关代码以便于维护。对于大型项目,每个模块都可以通过惰性加载、隐藏实现细节和公开常用API来提高
性能,普通类库(如下划线、jQuery)可以理解为单模式
应用程序。
实战结合
正如我们前面说过的,单件模式是最常用的设计模式之一。让我们举个例子来说明。
下面的代码主要实现一个简单的
日期帮助类,由单一模式实现:
基本单形结构
无功datetimehelper = { {
现在:函数(){
返回新日期();
},
格式:函数(日期){
返回date.getfullyear()+-+(date.getmonth()+ 1)+-+ date.getdate();
}
};
console.log(datetimehelper.now());
此代码通过对象的文字数量实现单个模式,并且在使用该方法时可以直接调用该模式。
延迟加载实现单模式
无功datetimehelper =(函数(){()
函数init(){
返回{
现在:函数(){
返回新日期();
},
格式:函数(日期){
返回date.getfullyear()+-+(date.getmonth()+ 1)+-+ date.getdate();
}
}
}
var实例= null;
返回{
getInstance(){:功能
如果(!实例){
实例= init();
}
返回实例;
}
}
});
console.log(datetimehelper.getinstance(),())
这是惰性负载的单一模式。
这里还有几个例子:
实现1:最简单的文字对象
var
属性:1,
方法:功能(){ return这个属性;}
}
单变量;
var =单例;
很清楚,t1 = T2。
这是非常简单和非常有用的,缺点是没有封装,所有的属性方法都暴露出来。对于一些需要使用私有变量的情况,这是不够的。当然,这个问题有一些缺点。
实现2:构造函数的内部判断
事实上,它与原始js实现有点类似,但它是将已经存在的类的判断放在构造函数中。
函数构造(){
确保只有一个案例
如果(Construct.unique!=未定义的){
Construct.unique回来了;
}
其他代码
this.name =外皮;
这个。年龄=24;
Construct.unique =这;
}
新构造();
新构造();
然后,一些,t1 = T2。
它也很简单。只不过是提出一个判断的属性,但这种方式是不安全的。一旦我
修改了构造的唯一属性,就破坏了单例模式。
实施3:关闭
对于一个大型灵活的JS品牌,任何问题都可以找到N个答案,只是让我来权衡一下它的优点,这里有几种方法使用闭包来实现单模式,单例缓存无非是会创建的。
var =(函数(){())
VaR的独特;
函数构造(){
…单实例构造函数代码生成
}
独特的=新的建设();
返回独特;
});
只说var T1 =单次;var =单,OK。它类似于对象文字的
类型。但它相对安全,当然不是绝对安全的。
如果您想使用调用单()模式,只需要更改内部返回到
返回函数(){
返回独特;
}
上面的方法也可以用新的形式主义(当然是波特),当然,这只是闭包的一个例子,它也可以用来判断一个案例是否存在于构造中等等。
总结
单例模式的优势在于代码封装在一个对象的组织,不会被实例化多次相关的属性和方法,使代码的维护和调试更容易隐藏实现的细节,可以防止错误的修改,和全局命名
空间污染预防的。此外,它可以提高惰性加载以减少不必要的
内存消耗性能。