Actionscript3单例模式对象的释放控制
精选
转载
单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。通常定义一个单例类,使用类的私有静态变量指向类的唯一实例,并用一个公有静态方法获取该实例。如下面的类定义:
- 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);
- }
- }
- }