由于 AS3 不允许私有构造函数,因此构造单例并保证构造函数不是通过“new”显式创建的唯一方法似乎是传递单个参数并检查它。
我听过两个建议,一个是检查调用者并确保它是静态 getInstance(),另一个是在同一个包命名空间中有一个私有/内部类。
传递给构造函数的私有对象似乎更可取,但看起来您不能在同一个包中拥有私有类。这是真的?更重要的是,这是实现单例的最佳方式吗?
由于 AS3 不允许私有构造函数,因此构造单例并保证构造函数不是通过“new”显式创建的唯一方法似乎是传递单个参数并检查它。
我听过两个建议,一个是检查调用者并确保它是静态 getInstance(),另一个是在同一个包命名空间中有一个私有/内部类。
传递给构造函数的私有对象似乎更可取,但看起来您不能在同一个包中拥有私有类。这是真的?更重要的是,这是实现单例的最佳方式吗?
对 enobrev 的回答稍作调整,就是将实例作为吸气剂。有人会说这更优雅。此外,如果您在调用 getInstance 之前调用构造函数,则 enobrev 的答案不会强制执行 Singleton。这可能并不完美,但我已经对此进行了测试并且它有效。(在“Advanced ActionScrpt3 with Design Patterns”一书中肯定还有另一种好方法)。
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;
}
}
}
这是该问题的有趣摘要,它导致了类似的解决方案。
Cairngorm 使用的模式(可能不是最好的)是在构造函数被第二次调用时在构造函数中抛出运行时异常。例如:
public class Foo {
private static var instance : Foo;
public Foo() {
if( instance != null ) {
throw new Exception ("Singleton constructor called");
}
instance = this;
}
public static getInstance() : Foo {
if( instance == null ) {
instance = new Foo();
}
return instance;
}
}
您可以像这样获得私人课程:
package some.pack
{
public class Foo
{
public Foo(f : CheckFoo)
{
if (f == null) throw new Exception(...);
}
}
static private inst : Foo;
static public getInstance() : Foo
{
if (inst == null)
inst = new Foo(new CheckFoo());
return inst;
}
}
class CheckFoo
{
}