无梦空间

JavaScript极限编程

导航

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;
            }
            
        }


        
//私有类
        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();  来创建.这里就形成了单件模式的必要条件.

posted on 2006-08-11 13:21  想那风霜雪  阅读(463)  评论(0编辑  收藏  举报