一个非常简单的单身人士?

dav*_*mer 0 apache-flex flash actionscript-3

这在动作脚本中作为Singleton运行良好吗?即是否有任何我应该知道的问题,并且在这种情况下只会创建一个AVManager实例:

请注意,我确实获得了预期的输出(只有一次"实例化第一次",数字跟随序列):

第一次实例化!1

文件1:2

文件2:3

最后4

这是文件....

AV_CONFIG.as:

package {
    public class AV_CONFIG {
        public static var AVM:AVManager = new AVManager();
    }
}
Run Code Online (Sandbox Code Playgroud)

AVManager.as:

package {
    import flash.events.EventDispatcher;

    public class AVManager extends EventDispatcher {
        public var someConstantData:uint = 1;

        public function AVManager() {
            trace('instantiated first time!', someConstantData);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

File1.as:

package {
    import AV_CONFIG;
    import flash.display.Sprite;

    public class File1 extends Sprite {

        public function File1() {
            AV_CONFIG.AVM.someConstantData++
            trace('FILE 1:', AV_CONFIG.AVM.someConstantData);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

File2.as:

package {
    import AV_CONFIG;
    import flash.display.Sprite;

    public class File2 extends Sprite {

        public function File2() {
            AV_CONFIG.AVM.someConstantData++
            trace('FILE 2:', AV_CONFIG.AVM.someConstantData);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Main.as(DocumentClass):

package {
    import AV_CONFIG;
    import flash.display.Sprite;

    public class Main extends Sprite {

        public function Main() {
            var f1:File1 = new File1();
            var f2:File2 = new File2();
            AV_CONFIG.AVM.someConstantData++
            trace('and finally', AV_CONFIG.AVM.someConstantData);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*rty 7

通常你会想要单身:

  1. 限制或消除创建该类实例的能力.
  2. 创建一种静态获取该类实例的方法.

例:

public class AvManager
{

    private static var _instance:AvManager;
    internal static var created:Boolean = false;

    public function AvManager()
    {
        if(AvManager.created)
        {
            throw new Error("Cannot created instances of AvManager, use AvManager.instance.");
        }

        AvManager.created = true;
    }

    public static function get instance():AvManager
    {
        if(_instance == null)
        {
            _instance = new AvManager();
        }

        return _instance;
    }

    public function test():void
    {
        trace("Working.");
    }

}
Run Code Online (Sandbox Code Playgroud)

你现在可以使用的地方:

AvManager.instance.test(); // Working.
Run Code Online (Sandbox Code Playgroud)