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