2011-07-06 45 views
0

我正在製作一個圖書館,以便將來可以被各種人使用。如何編寫類:只能創建具有特定(唯一)字段的一個對象!

class WrapperMoveable 
{ 
    IMoveable moveable; 

    public WrapperMoveable(IMoveable moveable) 
    { 
     this.moveable = moveable; 
    } 
} 

的問題:如何編輯WrapperMoveable類,以確保特別IMoveable exacly一個對象可以存在。如果有人試圖用某個接口創建一個包裝器對象,並且當包含該接口的包裝器類已經存在時,mechanizm應該返回現有的包裝器對象。

我有一些解決方案,但請你自己先思考一個問題。

解決方案:

  1. 創建包裝類,包含所有創建的包裝對象靜態字段。

    class WrapperMoveable 
    { 
        IMoveable moveable; 
    
        static List<WrapperMoveable> createdWrappers = new List<WrapperMoveable>(); 
    
        private WrapperMoveable(IMoveable moveable) 
        { 
         this.moveable = moveable; 
        } 
    
        public static WrapperMoveable CreateWrapper(IMoveable moveable) 
        { 
         if (createdWrappers.Any(e => e.moveable == moveable)) 
          return createdWrappers.First(e => e.moveable == moveable); 
    
         WrapperMoveable newWrapper = new WrapperMoveable(moveable); 
         createdWrappers.Add(newWrapper); 
    
         return newWrapper; 
        } 
    } 
    

    該方法的問題在於程序員不能通過使用新關鍵字來正常創建對象。所以程序員必須知道只能用靜態方法創建對象。此外,garbridge收集器不會釋放該對象,因爲引用始終存在於createdWrappers中。

  2. 創建,創建包裝類,一類WrapperFactory。如前例所示,proggramer必須知道如何創建包裝對象。在這個解決方案中使用工廠類。

  3. 通過掃描所有對象類型WrapperMoveable的存儲器,並檢查是否該對象包含提供接口。

什麼解決方案,這個問題在你看來是最好的?梅比你有你自己更好的解決方案?

回答

0

你能在類中創建一個靜態int和做一個計數。當int大於1時拋出異常?

+0

請閱讀帖子正文! – MaciejLisCK

+0

我會看看創建一個靜態的int = 0。用它作爲參考計數。如果計數顯示newwrapper已經被創建,那麼返回就會創建它。希望這是你的後? – Steve

0

如果你想控制'新'運營商;然後使用工廠模式,是唯一的乾淨方式。首先,你的班級知道創建自己的一些邏輯。有了工廠,你可以將這種邏輯分類出來。這是一件好事。

我認爲創建包裝需要一個額外的參數。

public static WrapperMoveable CreateWrapper(IMoveable moveable, EndPoint ep) 
{ 
     if (createdWrappers.Any(e => e.EndpointObject == endpoint)) 

對於第三個。也許你可以寫一些控制創建和處理的gc-like監聽器。

但你的問題看起來就像是在wrapperMoveable。你創建一個包裝器,並在實例化之後,將其設置爲endpoint屬性。包裝的創建與該屬性相關(實例列表不知道過濾屬性)。如果您反轉創建順序可能會更好。

+0

哦,我在代碼中犯了一個錯誤。現在它是正確的! – MaciejLisCK

+0

我害怕使用工廠,因爲它會造成一些誤解。在我編寫代碼時,代碼將被編譯爲庫,因此被其他人使用。我想當他們發現一個WrapperMoveable類時,他們更容易找到一個創建類的靜態方法,然後他們將找到單獨的類。 – MaciejLisCK

+0

class WrapperMoveable { IMoveable movingable; static HashSet createdWrappers = new HashSet (); \t private WrapperMoveable(可移動的可移動) this.moveable = moveable; } \t \t \t 公共靜態WrapperMoveable CreateWrapper(IMoveable可移動) { 如果(createdWrappers.Any(E => e.moveable ==可移動)) 返回createdWrappers.First(E => e.moveable ==可動); WrapperMoveable newWrapper = new WrapperMoveable(moveable); createdWrappers.Add(newWrapper); return newWrapper; } – MaciejLisCK

相關問題