考虑这种情况,我们有一个 A类,它是单身,它有一个函数 Sum(a,b)**。现在我们分别有两个类** B类和 C类。两个类(B,C)都调用add函数并监听事件。
Class A
{
function add(a:int,b:int):void
{
c:int = a+b;
dispatchEvent(new myEvent(myEvent.addComplete,c));
}
}
Class B
{
function addSomething():void
{
var objectA:A = new A();
objectA.addEventListener(myEvent,onAddComplete);
var a:int = 10;
var b:int = 20;
objectA.add(a,b);
}
function onAddComplete(e:myEvent):void
{
trace(e.something);
}
}
同样有一个C和D类。现在,当我们说两个类都调用A的add函数时(当A是单例时),如何确保将正确的答案返回给正确的监听器。
其次,如果调用正在改变某些内容,那么单例中是否存在锁定?
答案 0 :(得分:1)
当您实例化Singleton时,不使用“new”,否则它不会是Singleton,您将继续创建A类的实例。为了使您的类成为Singleton,只能创建一个实例,这样,当您在其他类中调用A时,您将调用相同的A实例。
通常使用getInstance方法,该方法返回Singleton类的实例(如果不存在)或返回先前创建的A实例。
请查看此信息以获取更多信息: http://www.gskinner.com/blog/archives/2006/07/as3_singletons.html
人们普遍认为应尽可能避免使用Singleton。你应该在这里找到一些解释原因的帖子,这里有一个例子:
What is so bad about singletons?
在您的示例中,您可以执行此操作:
class A { function add( params:Object , dispatcher:EventDispatcher ) { c = params.a + params.b; dispatcher.dispatchEvent( new MyEvent(c) ); } } class B { private var _dispatcher:EventDispatcher = new EventDispatcher(); function addSomething():void { var objectA:A = new A(); _dispatcher.addEventListener(MyEvent.ADD,onAddComplete); var params:Object = {a:10 , b:20}; objectA.add(params , _dispatcher); } function onAddComplete(e:MyEvent):void { trace(e.something); } }