2008-09-25 149 views
4

因爲AS3不允許使用私有構造函數,所以似乎構建單例並保證構造函數不是通過「new」創建的唯一方法是傳遞一個參數並檢查它。在Actionscript 3中實現單例模式類的最佳方式是什麼?

我聽說過兩個建議,一個是檢查調用者並確保它是靜態getInstance(),另一個是在同一個包名稱空間中有一個私有/內部類。

在構造函數上傳遞的私有對象看起來更可取,但它看起來並不像在同一個包中可以有私有類。這是真的?更重要的是它是實現單身人士的最佳方式?

+1

單身人士是一個壞主意。請勿使用它們:http://googletesting.blogspot.com/2008/08/by-miko-hevery-so-you-join-new-project.html – Glyph 2008-10-15 21:37:54

+1

Glyph - 您指出的文章顯示爲何隱藏的依賴項是不好,不是爲什麼辛格爾頓不好。你可以有沒有隱藏的依賴關係的單身人士。 – 2008-10-22 18:33:26

回答

11

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{} 
0

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

}  
+1

「私人靜態Foo實例;」 - 這甚至沒有ActionScript – Iain 2008-09-25 11:42:33

0

你可以得到一個私有類,像這樣:

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 
{ 
} 
+0

你實際上並沒有在這裏創建一個單身人士 – Iain 2008-09-25 11:41:26

+0

呃...是的。我在考慮私人課堂問題,並弄錯了真正的問題。現在修好嗎? – 2008-09-26 08:34:35

5

我一直在使用了一段時間,我相信我最初是從各地的維基百科了。

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的問題,這導致了類似的解決方案。

相關問題