單例模式保證一個類僅有一個實例,並提供一個訪問它的全局訪問點,該實例被所有程序模塊共享。通常定義一個單例類,使用類的私有靜態變量指向類的唯一實例,並用一個公有靜態方法獲取該實例。如下面的類定義:
- package com.moorwind
- {
- public final class Singleton
- {
- //Other members.
-
- private static var _instance:Singleton;
- public function Singleton(enforcer:SingletonEnforcer)
- {
- if(!enforcer)throw new Error("Singleton Error");
- }
- public static function getInstance():Singleton
- {
- if(!_instance)_instance = new Singleton(new SingletonEnforcer());
- return _instance;
- }
-
- }
- }
- class SingletonEnforcer{}
單例類Singleton有以下特徵:
1.它有一個指唯一實例的靜態指針_instance,並且是私有的。
2.它有一個公有的函數,可以獲取這個唯一的實例,並在需要的時候創建該實例。
3.它的構造函數使用了包內類的,這樣就不能從別處創建該類的實例。
大多時候,這樣的實現都不會出現問題。但是_instance指向的空間什麼時候釋放呢?更嚴重的問題是,這個實例的析構操作什麼時候執行?如果在類的析構 行爲中有必須的操作,比如關閉文件,釋放外部資源,那麼上面所示的代碼無法實現這個要求。我們需要一種方法,正常地刪除該實例。
C++中的析構函數可以幫助C++完美的實現這個功能,蘇林的文章就寫到了實現方法。Actionscript3只好採用一種很不優雅的方式,手工析構這個實例。
- package com.moorwind
- {
- public final class Singleton
- {
- private static var _instance:Singleton;
- public function Singleton(enforcer:SingletonEnforcer)
- {
- if(!enforcer)throw new Error("Singleton Error");
- }
- public static function getInstance():Singleton
- {
- if(!_instance)_instance = new Singleton(new SingletonEnforcer());
- return _instance;
- }
-
- public static function destroy():void
- {
- _instance = null;
- }
-
- }
- }
- class SingletonEnforcer{}
-
- //
- package {
- import com.moorwind.Singleton;
-
- import flash.display.Sprite;
- import flash.utils.clearTimeout;
- import flash.utils.setTimeout;
-
- public class SingleTest extends Sprite
- {
- private var instance:Singleton;
- private var id:int;
- public function SingleTest()
- {
- runTest();
- id = setTimeout(testDestroy, 2000);
- }
-
- private function runTest():void
- {
- instance = Singleton.getInstance();
- }
-
- private function testDestroy():void
- {
- trace("destroy");
- instance = null;
- Singleton.destroy();
- clearTimeout(id);
- }
- }
- }