AS3单例模式(Singleton Pattern)
发布:Coamy | 发布时间: 2010年7月12日在面向对象的编程中,有时候会要求一个类有且仅存在一个实例,并提供一个全局的访问方法。所以我们在设计这样的类的时候,就需要思考如何避开构造函数,提 供一种机制来实现单例(单一实例)。这就是单例模式。另因为在AS3中无法操作线程,因此我们无需考虑多线程情况下的单例。
单 例模式的几种AS3实现
在AS3中有多种方法可以实现Singleton模式,首先看下面的方法1:
package {2
public class Singleton {3
private static var _instance:Singleton = new Singleton();4
public function Singleton() {5
if (_instance) {6
throw new Error("只 能用getInstance()来获取实例");7
}8
}9
public static function getInstance():Singleton {10
return _instance;11
}12
}13
}此方法通过静态私有变量_instance来创建Singleton类的实例,通过getInstance方法来访问这个单一实例。另外,由于在 AS3中不允许private、protected的构造函数,只能是public,因此需要防止用构造函数来创建Singleton类的实例。这个方法 有个问题就是这个类的实例会在程序一开始就创建。
方法2:
package {2
public class Singleton {3
private static var _singleton:Boolean=true;4
private static var _instance:Singleton;5
public function Singleton() {6
if (_singleton) {7
throw new Error("只 能用getInstance()来获取实例");8
}9
}10
public static function getInstance() {11
if (!_instance) {12
_singleton=false;13
_instance=new Singleton();14
_singleton=true;15
}16
return _instance;17
}18
}19
}此方法通过一个静态私有变量_singleton来控制_instance的创建,保证其唯一性。并且这个方法不存在方法1中的问 题,_instance实例只有在调用getInstance()方法后才会创建。
方法3:
package {2
public class Singleton {3
private static var singleton : Singleton;4
public function Singleton( caller : Function = null ) {5
if ( caller != hidden ) {6
throw new Error("只 能用getInstance()来获取实例");7
}8
if ( Singleton.singleton != null ) {9
throw new Error("只 能用getInstance()来获取实例");10
}11
}12
public static function getInstance():Singleton {13
if ( singleton == null ) {14
singleton = new Singleton( hidden );15
}16
return singleton;17
}18
private static function hidden():void {19
}20
}21
}此方法通过对构造函数增加参数来控制单个实例的创建。此构造函数只有传入参数为私有方法hidden的时候,才能创建实例。私有方法hidden 对外的不可见性保证了单例的实现。
方法4:
package {2
public class Singleton {3
private static var _instance:Singleton;4
public function Singleton(singletoner:Singletoner) {5
if (singletoner == null) {6
throw new Error("只 能用getInstance()来获取实例");7
}8
}9
public static function getInstance():Singleton {10
if (_instance == null) {11
_instance = new Singleton(new Singletoner());12
}13
return _instance;14
}15
}16
}17
internal class Singletoner {18
}此方法和方法3相似。这里利用了包外类对外的不可见性(Singletoner类仅在此as文件内可见)来保证单例的实现。
总 结
单例模式的实现方式很多,在不同的需求下选择合适的才是最好的。比如方法1虽然一开始就会创建实例,但它不会像其他 方法每次调用实例都要检查是否存在类的实例。Singleton模式只考虑实例的创建,而没有考虑到销毁,由垃圾回收机制自行处理。另外,你也可以扩展 Singleton模式,比如稍做修改保证一个类只有少数几个实例,来实现一些特殊的目的,这样做也是合理和有意义的。
- 相关文章:
在AS3中eval的取代方法 (2010-7-11 18:14:43)
解决Flash加载外部数据的缓存问题 (2010-7-11 15:3:23)
as3的跨域访问安全沙箱 (2010-7-3 9:35:53)
PureMVC初探 (2010-6-28 21:28:20)
flash模块开发 (2010-6-28 21:9:28)
AStar A*寻路算法 (2010-6-24 21:29:52)
AS3事件中target和currentTarget的区别 (2010-1-18 14:20:36)
as3数组的浅复制和深复制 (2010-1-18 11:45:38)
as3悬停提示框类 (2010-1-13 11:9:42)
ColorTransform 构造函数 - as3 (2010-1-11 14:33:22)
发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。







