单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。通常定义一个单例类,使用类的私有静态变量指向类的唯一实例,并用一个公有静态方法获取该实例。如下面的类定义:


  1. package com.moorwind 
  2.   public final class Singleton 
  3.   { 
  4.     //Other members. 
  5.  
  6.     private static var _instance:Singleton; 
  7.     public function Singleton(enforcer:SingletonEnforcer) 
  8.     { 
  9.       if(!enforcer)throw new Error("Singleton Error"); 
  10.     } 
  11.     public static function getInstance():Singleton 
  12.     { 
  13.       if(!_instance)_instance = new Singleton(new SingletonEnforcer()); 
  14.       return _instance; 
  15.     } 
  16.      
  17.   } 
  18. class SingletonEnforcer{} 

单例类Singleton有以下特征:
1.它有一个指唯一实例的静态指针_instance,并且是私有的。
2.它有一个公有的函数,可以获取这个唯一的实例,并在需要的时候创建该实例。
3.它的构造函数使用了包内类的,这样就不能从别处创建该类的实例。

大多时候,这样的实现都不会出现问题。但是_instance指向的空间什么时候释放呢?更严重的问题是,这个实例的析构操作什么时候执行?如果在类的析构 行为中有必须的操作,比如关闭文件,释放外部资源,那么上面所示的代码无法实现这个要求。我们需要一种方法,正常地删除该实例。
C++中的析构函数可以帮助C++完美的实现这个功能,苏林的文章就写到了实现方法。Actionscript3只好采用一种很不优雅的方式,手工析构这个实例。

  1. package com.moorwind 
  2.   public final class Singleton 
  3.   { 
  4.     private static var _instance:Singleton; 
  5.     public function Singleton(enforcer:SingletonEnforcer) 
  6.     { 
  7.       if(!enforcer)throw new Error("Singleton Error"); 
  8.     } 
  9.     public static function getInstance():Singleton 
  10.     { 
  11.       if(!_instance)_instance = new Singleton(new SingletonEnforcer()); 
  12.       return _instance; 
  13.     } 
  14.      
  15.     public static function destroy():void 
  16.     { 
  17.       _instance = null
  18.     } 
  19.  
  20.   } 
  21. class SingletonEnforcer{} 
  22.  
  23. //-----------------------------------------------------test: 
  24. package { 
  25.   import com.moorwind.Singleton; 
  26.    
  27.   import flash.display.Sprite; 
  28.   import flash.utils.clearTimeout; 
  29.   import flash.utils.setTimeout; 
  30.  
  31.   public class SingleTest extends Sprite 
  32.   { 
  33.     private var instance:Singleton; 
  34.     private var id:int
  35.     public function SingleTest() 
  36.     { 
  37.       runTest(); 
  38.       id = setTimeout(testDestroy, 2000); 
  39.     } 
  40.      
  41.     private function runTest():void 
  42.     { 
  43.       instance = Singleton.getInstance(); 
  44.     } 
  45.      
  46.     private function testDestroy():void 
  47.     { 
  48.       trace("destroy"); 
  49.       instance = null
  50.       Singleton.destroy(); 
  51.       clearTimeout(id); 
  52.     } 
  53.   }