Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在ActionScript3中实现单例模式类的最佳方法是什么?_Actionscript 3_Design Patterns_Oop_Singleton - Fatal编程技术网

Actionscript 3 在ActionScript3中实现单例模式类的最佳方法是什么?

Actionscript 3 在ActionScript3中实现单例模式类的最佳方法是什么?,actionscript-3,design-patterns,oop,singleton,Actionscript 3,Design Patterns,Oop,Singleton,由于AS3不允许私有构造函数,因此似乎构造单例并保证构造函数不是通过“new”显式创建的唯一方法是传递单个参数并检查它 我听过两个建议,一个是检查调用方并确保它是静态getInstance(),另一个是在同一个包名称空间中有一个私有/内部类 传递给构造函数的私有对象似乎更可取,但它看起来不像您可以在同一个包中拥有私有类。这是真的吗?更重要的是,这是实现单例的最佳方式吗?Cairngorm使用的模式(可能不是最好的)是,如果第二次调用构造函数,则在构造函数中引发运行时异常。例如: public c

由于AS3不允许私有构造函数,因此似乎构造单例并保证构造函数不是通过“new”显式创建的唯一方法是传递单个参数并检查它

我听过两个建议,一个是检查调用方并确保它是静态getInstance(),另一个是在同一个包名称空间中有一个私有/内部类


传递给构造函数的私有对象似乎更可取,但它看起来不像您可以在同一个包中拥有私有类。这是真的吗?更重要的是,这是实现单例的最佳方式吗?

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
{
}

我已经用了一段时间了,我相信我最初是从所有地方的维基百科上得到的

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;
        }
    }
}

这导致了类似的解决方案

对enobrev答案的一个轻微修改是以实例作为获取者。有人会说这更优雅。此外,如果您在调用getInstance之前调用构造函数,enobrev的答案将不会强制执行单例。这可能不是完美的,但我已经测试过了,它是有效的。(在《带设计模式的Advanced ActionScrpt3》一书中,肯定还有另一种很好的方法可以做到这一点)


你并不是真的在这里创造一个单身汉。。。是 啊我在考虑私家班的问题,但把真正的问题搞错了。现在修复了吗?Foo(CheckFoo f)应该是Foo(f:CheckFoo)-该死的动作脚本!“private static Foo instance;”-这甚至不是ActionScriptUp投票,因为这是正确的,与其他答案不同。您还可以使用“实例”作为getter,这对于FlashDevelop中的代码自动完成更好。这可能就是Daniel(来自链接)在属性声明中实例化实例变量的原因。我将更新我的(和+1到您的getter-nice解决方案!)这很好,但缺点是在运行时而不是编译时进行检查;var multiton1:Singleton=新的Singleton(x);var multiton2:Singleton=newsingleton(x)。。。编译得很好。哦,这不太正确!当我不太忙的时候,我会检查一下。没有办法让它在编译时总是出错,只是传递'null'也可以。如果运行成功,我会感到惊讶-这将是一个AS3错误。传递null将不起作用,它将编译,但代码检查它,您将得到一个运行时异常。我的代码示例的要点是,它可以编译并绕过检查。要解决这个问题,您可以将测试更改为“enforcer is SingletonEnforcer”,这将检查类型和null。单例是个坏主意。不要使用它们:Glyph——您所指的文章说明了隐藏依赖项的坏处,而不是单例的坏处。您可以拥有没有隐藏依赖项的单例。
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{}