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

时间:2012-06-26 07:26:29

标签: actionscript-3 flash flex

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

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

  

第一次实例化! 1

     

文件1:2

     

文件2:3

     

最后4

以下是文件....

AV_CONFIG.as:

package {
    public class AV_CONFIG {
        public static var AVM:AVManager = new AVManager();
    }
}

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

    }
}

然后:

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

    }
}

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

    }
}

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

    }
}

4 个答案:

答案 0 :(得分:7)

一般情况下你想要单身:

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

    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.");
        }
    
    }
    

    您现在可以使用的地方:

    AvManager.instance.test(); // Working.
    

答案 1 :(得分:2)

最大的问题是allowing global access to something if its state can be changed。如果这是一个项目,你希望代码库的维护时间超过一周左右,并且你认为它可能有超过500行代码,我强烈建议避免这样做 - 我可以从经验告诉你在一个大型项目中,很难不可能弄清楚哪些数百个可以访问您的Singleton的类对其导致给定错误的状态进行了更改。

接下来,需求有一种变化的方式。如果您突然需要2个AVManagers怎么办?你会发现你已经为你的静态创建了这么多的引入参考,改变它会使整个项目变得糟糕。我再次根据这里的经验说话。如果你使用依赖注入(这只是一种可怕的方式,说需要AVManager的类具有从外部填充的属性),那么这些类型的更改变得容易......只需给它们一个不同的AVManager,就完成了。

最后,如果您有任何想要进行测试驱动开发的假装,那么以这种方式使用全局/静态将基本上使所有代码都不可测试。您不能提供备用的AVManager进行测试,因为所有依赖于它的类都是硬连接的,以获得特定的AVManager。

祝你好运!

答案 2 :(得分:1)

是的,这样可以正常工作,另一种方法是将AVManager放在顶部的自己的类文件中:

private static var AVM:AVManager = new AVManager();

并在需要时使用AVManager类中的函数获取它,如下所示:

public static function GetInstance():AVManager {
    return AVM;
}

这种设置不是必需的,但通过禁止直接访问提供了一些很好的保护。

祝你的项目好运。

答案 3 :(得分:0)

请参阅此代码,尝试创建不同的内容。

AS3中的其他Singleton

首先是Interface

package test {
public interface Foo {

    function func0():void;

    function func1(arg:String):String;


}
}

然后是Singleton

package test {
public class BASIC_FOO {
    public static const BASIC_FOO:Foo = new BasicFoo();
}
}

import test.Foo;

class BasicFoo implements Foo {

    public function func0():void {
    }

    public function func1(arg:String):String {
        return arg;
    }
}