2012-01-09 13 views
3

我工作的一個項目中的合作開發(和以前的開發商)一個使用單例/門面只是關於上課的每一頁有任何好處它內部有很多方法調用,但實際上並不維護數據。試圖找出如果這個代碼創建通過使用一個Singleton

例如:

public class FooFacade 
{ 
    private static FooFacade m_facade = null; 
    private static DataAccessManager m_dataAccessMgr = null; 

    public StringBuilder Status {get; set; } 

    private FooFacade() 
    { 
     this.Status = new StringBuilder(); 
    } 

    public static FooFacade getInstance() 
    { 
     if (m_facade == null) 
     { 
      m_dataAccessMgr = DataAccessManager.getInstance(); 
      m_facade = new FooFacade(); 
     } 

     return m_facade; 
    } 

    public void clearStatus() 
    { 
     this.Status.Remove(0, Status.Length); 
    } 

public void Method1(string value1, int value2) 
    { 
    // DO SOMETHING 
    } 


public List<string> Method2(string value1, int value2) 
    { 
    // DO SOMETHING ELSE 
    // RETURN LIST 
    } 

現在,我有一個命名約定,他們有Singelton同一類的門面和內部其實事實的某些問題,該門面是不是真的正面。 (但這是完全不同的談話)。

所以我的問題是,是否真的是從這個好處。開發人員可以解釋的最好方法是內存管理更好,因爲你不是經常創建和處理對象。

我們的應用程序是不是一個企業級應用程序,我們沒有與內存問題。任何時候這個網站都很慢,這實際上是由於數據庫而不是代碼。

感謝您的幫助。我是一位開發人員,他很想知道爲什麼要讓自己成爲更好的開發人員。由於我無法用語言從開發人員那裏得知它,所以我正在向你們伸出援助之手。

感謝, 乍得

修訂 由於下面的評論,我知道狀態是一個嚴重的問題,因爲它擁有的是一個巨大的安全漏洞的機會。在涉及內存管理,速度等方面,在Singleton中使用此代碼有什麼好處?或者,每當我需要它時,實例化FooFacade會更容易一些。

+0

StringBuilder跳出來給我。這是你說班級沒有的共享狀態的一個例子,但它顯然確實如此。該屬性和'clearStatus'方法可能會帶來挑戰。 – 2012-01-09 18:48:08

+0

因此,如果我聽到您的說法正確,那麼可能會將來自一位用戶的狀態消息顯示給其他用戶? – Cyfer13 2012-01-09 18:58:13

+0

Plus添加到,清除,顯示;以上所有的混合和匹配。全球狀態很難。這聽起來像以前的開發人員發現了一個模式,並對此感到非常滿意。 – 2012-01-09 19:06:28

回答

6

因爲你的對象有一個內部狀態(Status)你是在自找麻煩。具體來說,如果單個線程在多個線程中使用(例如在Web應用程序中),那麼代碼可能無法正常工作。

使用單身只有當你有沒有內部狀態類。

+1

是啊,那是我遇到的問題之一。如果DAL發生錯誤,則會更新該狀態消息。是的,真的。沒有拋出他的例外。 – Cyfer13 2012-01-09 18:55:54

+0

我感到你的痛苦,兄弟。 :) – kamranicus 2012-01-09 19:08:49

2

有沒有當談到內存管理,速度快等優點在一個Singleton使用此代碼的任何好處?或者,每當我需要它時,實例化FooFacade會更容易一些。

所有此類型的一個實例是含有一種StringBuilder的引用。此外,沒有繁重打算創建一個新的實例時上(除非DataAccessManager.getInstance()做幕後的一些骯髒的東西)。所以不,在內存管理,速度等方面沒有明顯的好處。我只是在需要的時候實例化一個新的實例。 (或者說:我會盡量擺脫這個類完全...)

1

我會保存單身模式的東西,必須作爲單身存在,如多個消費者之間共享的特定文件。單身通常涉及隔離線程問題。但是,如果您有一個不包含狀態的類並且使用單例模式實現,那麼您已經實現了一個實用類,它很容易成爲反模式。雖然不是一個好主意,但用靜態方法將其作爲一個靜態類會更高效。在調用方法之前,靜態方法不需要進行空檢查。但正如我在開始時所說的,將單身模式留給那些必須是單身人士的東西。

相關問題