Actionscript3單例模式對象的釋放控制

 
單例模式保證一個類僅有一個實例,並提供一個訪問它的全局訪問點,該實例被所有程序模塊共享。通常定義一個單例類,使用類的私有靜態變量指向類的唯一實例,並用一個公有靜態方法獲取該實例。如下面的類定義:


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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章