因爲AS3不允許使用私有構造函數,所以似乎構建單例並保證構造函數不是通過「new」創建的唯一方法是傳遞一個參數並檢查它。在Actionscript 3中實現單例模式類的最佳方式是什麼?
我聽說過兩個建議,一個是檢查調用者並確保它是靜態getInstance(),另一個是在同一個包名稱空間中有一個私有/內部類。
在構造函數上傳遞的私有對象看起來更可取,但它看起來並不像在同一個包中可以有私有類。這是真的?更重要的是它是實現單身人士的最佳方式?
因爲AS3不允許使用私有構造函數,所以似乎構建單例並保證構造函數不是通過「new」創建的唯一方法是傳遞一個參數並檢查它。在Actionscript 3中實現單例模式類的最佳方式是什麼?
我聽說過兩個建議,一個是檢查調用者並確保它是靜態getInstance(),另一個是在同一個包名稱空間中有一個私有/內部類。
在構造函數上傳遞的私有對象看起來更可取,但它看起來並不像在同一個包中可以有私有類。這是真的?更重要的是它是實現單身人士的最佳方式?
enobrev的答案略有改動是將實例作爲getter。有人會說這更優雅。另外,如果在調用getInstance之前調用構造函數,enobrev的答案將不會強制執行Singleton。這可能並不完美,但我已經測試過它,它可以工作。 (在「帶有設計模式的高級ActionScrpt3」一書中,確實還有另一個好辦法)。
package {
public class Singleton {
private static var _instance:Singleton;
public function Singleton(enforcer:SingletonEnforcer) {
if(!enforcer)
{
throw new Error("Singleton and can only be accessed through Singleton.getInstance()");
}
}
public static function get instance():Singleton
{
if(!Singleton._instance)
{
Singleton._instance = new Singleton(new SingletonEnforcer());
}
return Singleton._instance;
}
}
}
class SingletonEnforcer{}
Cairngorm(可能不是最好的)使用的模式是如果構造函數被第二次調用,則會在構造函數中拋出運行時異常。例如:
public class Foo {
private static var instance : Foo;
public Foo() {
if(instance != null) {
throw new Exception ("Singleton constructor called");
}
instance = this;
}
public static getInstance() : Foo {
if(instance == null) {
instance = new Foo();
}
return instance;
}
}
「私人靜態Foo實例;」 - 這甚至沒有ActionScript – Iain 2008-09-25 11:42:33
你可以得到一個私有類,像這樣:
package some.pack
{
public class Foo
{
public Foo(f : CheckFoo)
{
if (f == null) throw new Exception(...);
}
}
static private inst : Foo;
static public getInstance() : Foo
{
if (inst == null)
inst = new Foo(new CheckFoo());
return inst;
}
}
class CheckFoo
{
}
你實際上並沒有在這裏創建一個單身人士 – Iain 2008-09-25 11:41:26
呃...是的。我在考慮私人課堂問題,並弄錯了真正的問題。現在修好嗎? – 2008-09-26 08:34:35
我一直在使用了一段時間,我相信我最初是從各地的維基百科了。
package {
public final class Singleton {
private static var instance:Singleton = new Singleton();
public function Singleton() {
if(Singleton.instance) {
throw new Error("Singleton and can only be accessed through Singleton.getInstance()");
}
}
public static function getInstance():Singleton {
return Singleton.instance;
}
}
}
Here's an interesting summary的問題,這導致了類似的解決方案。
單身人士是一個壞主意。請勿使用它們:http://googletesting.blogspot.com/2008/08/by-miko-hevery-so-you-join-new-project.html – Glyph 2008-10-15 21:37:54
Glyph - 您指出的文章顯示爲何隱藏的依賴項是不好,不是爲什麼辛格爾頓不好。你可以有沒有隱藏的依賴關係的單身人士。 – 2008-10-22 18:33:26