这在动作脚本中作为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);
}
}
}
答案 0 :(得分:7)
一般情况下你想要单身:
示例:
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;
}
}