JavaScript实现单件模式需要一些技巧,如我们定义一个类:
function
SingletonObject()
{
this.methodA = function()
{
alert('methodA');
}
this.methodB = function()
{
alert('methodB');
}
SingletonObject.instance = this;
}
如果想要使这个类只实例化一个类,单靠一般的单件模式是行不同的,因为只要new Object,就会创建一个对象实例.
{
this.methodA = function()
{
alert('methodA');
}
this.methodB = function()
{
alert('methodB');
}
SingletonObject.instance = this;
}
这里我们需要配合使用工厂方法模式,才能构建SingletonFactory类的单件模式,如下:
<
script type
=
"
text/javascript
"
>
// 利用匿名函数实现单件模式.
( function () {
//工厂模式
//创建一个类的创建工厂类.
SingletonFactory = {
create : function(){
if(SingletonObject.instance == null)
return new SingletonObject();
else
return SingletonObject.instance;
}
}
//私有类
function SingletonObject()
{
this.methodA = function()
{
alert('methodA');
}
this.methodB = function()
{
alert('methodB');
}
SingletonObject.instance = this;
}
} )();
// 经过以上设置后,只能通过SingletonFactory.create()来创建SingletonObject类的实例,而且是单一的实例.
// 如用 new SingletonObject()就会出错.
var instA = null ;
try
{
instA = new SingletonObject(); //不能用此方式进行创建了.
alert("试图通过new SingletonObject()构造实例!成功啦");
}
catch (e) {alert("SingletonObject构造函数不能从外部访问,系统抛出了异常!");}
instA = SingletonFactory.create(); // 通过Factory上定义的静态方法获得
var instB = SingletonFactory.create();
instA.methodA();
instB.methodA();
alert(instA == instB); // 显示"true"则成功
</ script >
这里的实现依赖于匿名函数的技巧,使SingletonObject类成为"私有"类,不能对外用new关键字来创建,而只能通过SingletonFactory.create(); 来创建.这里就形成了单件模式的必要条件.
// 利用匿名函数实现单件模式.
( function () {
//工厂模式
//创建一个类的创建工厂类.
SingletonFactory = {
create : function(){
if(SingletonObject.instance == null)
return new SingletonObject();
else
return SingletonObject.instance;
}
}
//私有类
function SingletonObject()
{
this.methodA = function()
{
alert('methodA');
}
this.methodB = function()
{
alert('methodB');
}
SingletonObject.instance = this;
}
} )();
// 经过以上设置后,只能通过SingletonFactory.create()来创建SingletonObject类的实例,而且是单一的实例.
// 如用 new SingletonObject()就会出错.
var instA = null ;
try
{
instA = new SingletonObject(); //不能用此方式进行创建了.
alert("试图通过new SingletonObject()构造实例!成功啦");
}
catch (e) {alert("SingletonObject构造函数不能从外部访问,系统抛出了异常!");}
instA = SingletonFactory.create(); // 通过Factory上定义的静态方法获得
var instB = SingletonFactory.create();
instA.methodA();
instB.methodA();
alert(instA == instB); // 显示"true"则成功
</ script >