2009-08-21 86 views
6

我有一個疑問,....你會如何創建Flex中一個Singleton類...Singleton類Flex中

有沒有像類名的任何公約應EB辛格爾頓也應該擴展任何其他類。

一個項目有多少個Singleton類?

任何人都可以說一個Singleton類的實時使用情況嗎?

我打算把我的組件標籤文本保存在一個Singleton類中......這是一個好方法。

回答

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()函數。

0

首先,您可以參考以前的question以瞭解如何創建單例類。您還可以從Yakov Fain presentation中找到更多信息。

第二個問題,你的項目技術可能有獨立類,如你所見,但它只會創建每個類的一個實例。例如,在cairngorm體系結構中,您有3個主要單例:控制器,服務和模型。實際班級的數量可能取決於您的項目。

最後,真實世界的解決方案將是。你有兩個組件需要彼此交談,但你不想讓他們知道另一個存在。意思是有時組件在那裏,有時它們不是......所以你需要它們鬆散耦合。您可以使用單例將數據從一個組件傳遞到另一個組件,而無需直接與其交談。

如果您需要將應用程序中的數據從組件傳遞到組件並希望將它們相互分離,那麼使用單例是一種很好的方法。

+0

我可以調用這樣的事情.. \t <![CDATA [ \t \t進口com.invoicetracking.includes.MyValues!; \t]]> \t的 Kevin 2009-08-21 15:12:37

+0

MyValues是一個Singleton類,addUser是一個變量。 – Kevin 2009-08-21 15:13:57

+0

肯定可以。只要確保添加了[Bindable]元標記 – Shua 2009-08-21 15:15:04

2

希望我沒有在這裏打死馬:)

(編輯:啊,我只是重複菲爾斯鏈接)

Gregors單執行不保護一個空值調用構造函數,如:

var b:Blah = new Blah(null); 

您將STI將只有1個實例,但調用構造函數仍然有可能產生後續結果。

如果你絕對必須執行單例,構造函數應確保執行者參數不爲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加載BBB.swf而沒有指示插件加載的LoaderContext實例BBB.swf到相同的ApplicationDomain的AAA.swf

+0

不幸的是,如果您需要在構造器中調用super(),那麼您的建議將無法正常工作,因爲您的單例繼承自另一個類。 – MadBlack 2013-07-25 16:03:36

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

    } 
} 

公告不存在構造這裏。