由于AS3不允许私有构造函数,因此构造单例并保证构造函数未通过"new"显式创建的唯一方法是传递单个参数并进行检查.
我听过两个建议,一个是检查调用者并确保它是静态getInstance(),另一个是在同一个包名称空间中有一个私有/内部类.
在构造函数上传递的私有对象似乎更可取,但看起来你不能在同一个包中拥有私有类.这是真的?更重要的是它是实现单身人士的最佳方式吗?
enobrev答案的略微改编就是将实例作为吸气剂.有人会说这更优雅.此外,如果在调用getInstance之前调用构造函数,enobrev的答案将不会强制执行Singleton.这可能不完美,但我已经测试了这个并且它有效.(在"带有设计模式的高级ActionScrpt3"一书中,还有另一种很好的方法可以做到这一点).
package { public class Singleton { private static var _instance:Singleton; public function Singleton(enforcer:SingletonEnforcer) { if( !enforcer) { throw new Error( "Singleton and can only be accessed through Singleton.getInstance()" ); } } public static function get instance():Singleton { if(!Singleton._instance) { Singleton._instance = new Singleton(new SingletonEnforcer()); } return Singleton._instance; } } } class SingletonEnforcer{}
我已经使用了一段时间,我相信我原来是从所有地方的维基百科.
package { public final class Singleton { private static var instance:Singleton = new Singleton(); public function Singleton() { if( Singleton.instance ) { throw new Error( "Singleton and can only be accessed through Singleton.getInstance()" ); } } public static function getInstance():Singleton { return Singleton.instance; } } }
以下是该问题的有趣总结,这导致了类似的解决方案.