4

AS3 ではプライベート コンストラクターが許可されていないため、シングルトンを構築し、コンストラクターが "new" によって明示的に作成されていないことを保証する唯一の方法は、単一のパラメーターを渡して確認することです。

2 つの推奨事項を聞いたことがあります。1 つは呼び出し元をチェックして、それが静的な getInstance() であることを確認すること、もう 1 つは同じパッケージ名前空間にプライベート/内部クラスを配置することです。

コンストラクターで渡されたプライベート オブジェクトは望ましいように見えますが、同じパッケージにプライベート クラスを含めることができるようには見えません。これは本当ですか?さらに重要なのは、シングルトンを実装する最良の方法ですか?

4

4 に答える 4

11

enobrev の答えをわずかに適応させると、インスタンスをゲッターとして持つことができます。これはよりエレガントだと言う人もいます。また、getInstance を呼び出す前にコンストラクターを呼び出すと、enobrev の回答はシングルトンを強制しません。これは完璧ではないかもしれませんが、私はこれをテストして動作します。(「高度な 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{}
于 2008-09-25T11:57:55.843 に答える
5

私はこれをしばらく使用してきましたが、これは元々すべての場所のウィキペディアから入手したものだと思います。

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

これは、同様の解決策につながる問題の興味深い要約です。

于 2008-09-25T07:47:51.573 に答える
0

Cairngorm で使用されるパターン (最適ではない可能性があります) は、コンストラクターが 2 回目に呼び出された場合に、コンストラクターで実行時例外をスローすることです。例えば:

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

}    
于 2008-09-25T03:16:09.077 に答える
0

次のようなプライベート クラスを取得できます。

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
{
}
于 2008-09-25T03:30:55.623 に答える