2012-07-30 161 views
1

我寫的代碼如下所示:辛格爾頓實例

public class SiteMapFactory { 

    public static ISiteMap getSiteMap(Locale loc) { 
     ISiteMap returnMap = null; 

     if (loc.equals(Locale.US)) { 
      returnMap = SiteMap_en_US.getInstance(); 
     } 
     if(loc.equals(new Locale("es","US"))){ 
      returnMap = SiteMap_en_US.getInstance(); 
     } 
     if(loc.equals(Locale.CANADA)){ 
      returnMap = SiteMap_fr_CA.getInstance(); 
     } 
     return returnMap; 
    } 
} 

我想回到同一個站點地圖爲我們的網站的兩個EN_US(英文)和es_US(西班牙)。因此,我正在實例化西班牙文和英文版的美國站點地圖(第三方供應商正在將我們的英文頁面轉換爲西班牙文)。網站地圖實例化的方式是使用單身人士。 Singleton對象創建如下:

public class SiteMap_en_US extends SiteMapTree { 
    private static SiteMap_en_US m_instance; 

    private SiteMap_en_US() {} 

    static { 
     m_instance = new SiteMap_en_US(); 
     m_instance.init(); 
    } 

    public static SiteMap_en_US getInstance(){ 
     return m_instance; 
    } 

    @Override 
    protected void init() { 
     //some code 
    } 
} 

我的問題是:我可以重複使用相同的單例對象兩次嗎?這是一個實例化單例對象的有效方法嗎?

+1

您並未創建兩個實例,但爲兩個語言環境返回相同的實例。因此,在一個語言環境中所做的更改會反映在其他語言環境中使用的對象中,這些問題將會出現問題。 – JProgrammer 2012-07-30 17:55:50

+0

這就是我們想要的。因爲我們只創建了英文模板。但是第三方供應商正在做西班牙語翻譯,並且我們沒有在我們的代碼庫中部署任何這些模板。我被給了一個任務來檢測西班牙語網站(我正在根據URL進行)並阻止某些西班牙語的事情。我可以很容易地做到這一點基於if/else邏輯 – pushya 2012-07-30 18:00:49

回答

1

是的,你可以重複使用相同的單一對象。

但是如果你這樣做,你不應該包括對象中的任何特殊處理,以確定它被用於何種語言,它應該簡單地行爲相同的方式所有的時間。

如果您必須使其行爲不同,請考慮創建SiteMap_en_US(SiteMap_es_US,也許)的子類,該子類從SiteMap_en_US派生,並且有少量行爲被覆蓋。

這是可以做到的對象內的各種場所的檢查,以確定其行爲,但我強烈建議考慮不同的方法,更易於維護。

0

這就是爲什麼許多人認爲辛格爾頓是一個反模式。您需要該對象的多個實例,每個區域設置一個實例。這不是一個單身人士。我喜歡說辛格爾頓只是全球變數的委婉說法。您基本上允許使用全局方式來訪問區域設置。

Singleton - The anti pattern

+0

請說明你的意思,當你說「你需要2個對象的實例」。提供的代碼僅創建一個實例。 – Wug 2012-07-30 17:58:48

+0

@Wug:我想在西班牙語和英語版本中重複使用同一個實例。我想知道我可以通過編碼如上 – pushya 2012-07-30 18:03:38

+0

@Wug我的意思是OP有每個地區的實例。它可能是單獨的類,所以你只有每個類的單個實例。但是,對我而言,它仍然創建了一些全球性的'SiteMapTree's(可以通過單例訪問) – 2012-07-30 18:03:51

0

您可以創建基地class SiteMapUS並將其擴展以創建兩個小類SiteMapUSEnglishSiteMapUSSpanish

public class SiteMapUS{ 
    protected SiteMapUS(){ 

    } 
} 

public class SiteMapUSEnglish{ 

    protected SiteMapUSEnglish(){ 

    } 

    public SiteMapUSEnglish getInstance(){ 
     //return instance 
    } 

} 


public class SiteMapUSSpanish{ 

    protected SiteMapUSSpanish(){ 

    } 

    public SiteMapUSSpanish getInstance(){ 
     //return instance 
    } 

} 

將所有的類放在單獨的包中。

這是爲了實現自己的目標最簡單的方法。使用這種方法的好處是,您可以輕鬆修改/添加與語言環境相關的更改,而無需修改其他代碼。