JavaScript的OO特性:Singleton单件模式

        只要有程序设计,就可以有设计模式.
        JavaScript实现单件模式需要一些技巧,如我们定义一个类:
None.gif          function  SingletonObject()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
this.methodA = function()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                alert('methodA');
ExpandedSubBlockEnd.gif            }

InBlock.gif            
this.methodB = function()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                alert('methodB');
ExpandedSubBlockEnd.gif            }

InBlock.gif            SingletonObject.instance 
= this;
ExpandedBlockEnd.gif        }
   
        如果想要使这个类只实例化一个类,单靠一般的单件模式是行不同的,因为只要new Object,就会创建一个对象实例.
        这里我们需要配合使用工厂方法模式,才能构建SingletonFactory类的单件模式,如下:
None.gif < script type = " text/javascript " >
None.gif    
None.gif    
// 利用匿名函数实现单件模式.
ExpandedBlockStart.gifContractedBlock.gif
    ( function () dot.gif {          
InBlock.gif        
//工厂模式
InBlock.gif
        //创建一个类的创建工厂类.
ExpandedSubBlockStart.gifContractedSubBlock.gif
        SingletonFactory = dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            create : 
function()dot.gif{
InBlock.gif                
if(SingletonObject.instance == null)
InBlock.gif                    
return new SingletonObject();           
InBlock.gif                
else
InBlock.gif                    
return SingletonObject.instance;
ExpandedSubBlockEnd.gif            }
            
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
//私有类
InBlock.gif
        function SingletonObject()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
this.methodA = function()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                alert('methodA');
ExpandedSubBlockEnd.gif            }

InBlock.gif            
this.methodB = function()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                alert('methodB');
ExpandedSubBlockEnd.gif            }

InBlock.gif            SingletonObject.instance 
= this;
ExpandedSubBlockEnd.gif        }
     
ExpandedBlockEnd.gif    }
)();
None.gif
None.gif
// 经过以上设置后,只能通过SingletonFactory.create()来创建SingletonObject类的实例,而且是单一的实例.
None.gif//
如用 new SingletonObject()就会出错.
None.gif
var  instA  =   null ;
None.gif
try
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {    
InBlock.gif    instA 
= new SingletonObject();  //不能用此方式进行创建了.
InBlock.gif
    alert("试图通过new SingletonObject()构造实例!成功啦");
ExpandedBlockEnd.gif}

ExpandedBlockStart.gifContractedBlock.gif
catch (e) dot.gif {alert("SingletonObject构造函数不能从外部访问,系统抛出了异常!");}
None.gif
None.gifinstA 
=  SingletonFactory.create();   // 通过Factory上定义的静态方法获得
None.gif
var  instB  =  SingletonFactory.create();
None.gifinstA.methodA();
None.gifinstB.methodA();
None.gifalert(instA 
==  instB);  // 显示"true"则成功
None.gif

None.gif
</ script >
        这里的实现依赖于匿名函数的技巧,使SingletonObject类成为"私有"类,不能对外用new关键字来创建,而只能通过SingletonFactory.create();  来创建.这里就形成了单件模式的必要条件.

转载于:https://www.cnblogs.com/fcrong/archive/2006/08/11/474197.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值