2013-05-18 67 views
2

我正在爲使用不同類型的零件(C#)構建機器人的程序提供解決方案。 在這種情況下,我有兩種類型共享某些屬性,並且這兩種類型的部件都從抽象類Part繼承。使用參數更正工廠方法的實現

到目前爲止,我從我的界面窗口中的實際按鈕代碼調用新的,這是這樣的。

if (type == acuatic) 
    Part pieceA = new AcuaticPart(type,name,price,maxDepth); 
else 
    Part pieceB = new TerrestrialPart(type,name,price,terrain,maxTemp); 

我知道這是完全錯誤的設計,我應該實施工廠方法。問題是我不知道這是否是好的,只是所有的參數發送到工廠這樣的:

在界面窗口

Part piece = _partFactory.CreatePart(type,name,price,maxDepth,terrain,maxTemp); 
在混凝土廠

public class ConcretePartFactory : PartFactory 
{ 
    public override Part CreatePart(type,name,price,maxDepth,terrain,maxTemp) 
    { 
     Part myPart = default(Part); 
     switch (type) 
     { 
      case "actuatic": 
       myPart = new AquaticPart(type,name,price,maxDepth); 
       break; 
      case "terrestrial": 
       myPart = new TerrestrialPart(type,name,price,terrain,maxTemp); 
       break; 
     } 
     return myPart; 
    } 
} 

事情是我仍然必須通過所有的屬性,我認爲這不是遵循開放/封閉的原則,我能做些什麼來解決這個問題?謝謝!

+0

assignign myPart = default(myPart)應該是您的case語句的默認值。 – CSharpie

回答

3

您可以嘗試使用與您提到的輸入參數相對應的不同簽名對工廠方法進行重載。在這種情況下,只需實現兩個具有相同名稱的方法,即有足夠的最小參數集返回不同類的對象。使用這種方法,您可以刪除「類型」

1

您可以使用抽象工廠而不是工廠方法進行此操作。您的抽象工廠將創建零件。然後,您可以爲要創建的每個零件創建從抽象工廠派生的具體工廠。這樣,您可以放棄類型檢查,因爲每個具體工廠只知道它的部分。你幾乎從PartFactory繼承了這一點。

這種方法唯一的問題是不同的零件需要不同的構件數據。這在抽象的Create()方法後面是不可能的。它可以在具體工廠的構造函數中處理,但是這意味着,在工廠的整個生命週期中,您都會堅持這些值。