我有一个疑问,......你将如何在Flex中创建一个Singleton类...
是否有类似于类名的约定应该是eb Singleton,或者它应该扩展任何其他类。
项目有多少个Singleton类?
有人可以说Singleton类的实时使用吗?
我打算将我的组件标签文本保存在Singleton类中......这是一种很好的方法。
答案 0 :(得分:17)
蠕虫可以询问单身人士!
有关创建单例的几个不同选项主要是由于AS3没有私有构造函数。这是我们使用的模式。
package com.foo.bar {
public class Blah {
private static var instance : Blah;
public function Blah( enforcer : SingletonEnforcer ) {}
public static function getInstance() : Blah {
if (!instance) {
instance = new Blah( new SingletonEnforcer() );
}
return instance;
}
...
}
}
class SingletonEnforcer{}
请注意,SingletonEnforcer类是内部的,因此只能由Blah类(有效地)使用。没有人可以直接实例化类,他们必须通过getInstance()函数。
答案 1 :(得分:2)
(编辑:啊,我只是重复phils链接)
Gregors单例实现不能防止使用null值调用构造函数,如:
var b:Blah = new Blah(null);
你仍然只有一个实例,但是仍然可以调用构造函数,后面会产生后果。
如果绝对必须强制实施单例,则构造函数应确保enforcer参数不为null。
public function Blah( enforcer : SingletonEnforcer ) {
if(!enforcer){
throw new Error("whoops!");
}
}
加载swf文件时,您还应该关注ApplicationDomain。如果您没有指定必须将swf文件加载到现有的applicationdomain中,那么使用相同定义的外部swf文件可能有多个单例实例(每个单独的applicationdomain中有1个)。
这意味着AAA.swf中的Blah.getInstance()与BBB.swf中的Blah.getinstance()不是同一个实例,如果AAA.swf在没有LoaderContext实例的情况下加载BBB.swf,该实例告诉插件加载BBB .swf与AAA.swf相同的ApplicationDomain
答案 2 :(得分:0)
首先,您可以引用之前的question来了解如何创建单例类。您也可以从Yakov Fain presentation找到更多信息。
第二个问题,您的项目可以按照您认为合适的方式使用单一类,但它只会创建每个类的1个实例。例如,在cairngorm架构中,您有3个主要单例:控制器,服务和模型。实际课程的数量很大程度上取决于您的项目。
最后,现实世界的解决方案将是。您有2个组件需要相互通信,但您不希望它们知道另一个存在。意思是有时组件在那里,有时它们不是......所以你需要它们松散耦合。你可以使用单例将数据从一个组件传递到另一个组件而不直接与它们“交谈”。
如果您需要将应用程序中的数据从一个组件传递到另一个组件并且希望将它们彼此分离,那么使用单例是一种很好的方法。
答案 3 :(得分:0)
package com.foo.bar
{
public class MySingleton
{
private static var _instance:MySingleton = new MySingleton;
private var _myName:String;
public static function get instance():MySingleton
{
return _instance;
}
public function set myName(value:String):void
{
_myName = value;
}
public function get myName():String
{
return _myName;
}
}
}
注意这里没有构造函数。
答案 4 :(得分:-1)
您好,您可以在http://www.how-to-code.com/flex/flex-design-patterns/flex-singleton-class.html
上查看以下Flex Singleton类示例