2015-01-14 19 views
1

我正在尋找的設計模式,以幫助相關的類實例化尋找用於填充類的一種設計模式,沒有數據庫

一個特殊的問題可以說我有一個名爲CarModel類,它具有類似性質:

CarModel 
{ 
    string MakeName 
    string ModelName 
    int NumberOfDoors 
    int NumberOfLiters 
    string StereoMake 
    bool HasAC 
    List<Color> ColorOptions 
    ...etc 
} 

並且可以說我的應用程序會從不同車型的代碼中爲多個位置實例化此類(如2015豐田凱美瑞LE,2015豐田卡羅拉SE,2013福特野馬GT等)。

這些不是單身人士,但每次實例化2015年豐田凱美瑞LE時,基本屬性將始終相同(因爲那些是2015款豐田凱美瑞LE的屬性)。所有的汽車模型都會得到滿足(所以這不適用於建造者)。

最後,假設這些屬性不能從數據庫或配置文件中獲得(假設平臺不支持它)。

我不想要發生的是,我不希望每個carModel被實例化的代碼的地方,都必須將這些屬性作爲參數傳遞給構造函數。來電者不必知道他們,另外它可能導致錯誤和維護問題。

我想要發生的是,我希望調用者只指定它想要的汽車模型,並且該類應該被填充。通常情況下,我會用數據庫後端做這種用例,但是,這不是一個選項。

我現在在想的是,我將傳入一個枚舉值給構造函數,並且該類將根據它自行初始化。所以:

public CarModel(CarModelTypes cmt) 
{ 
    if(cmt == CarModelTypes.2015_Toyota_Camry_LE) 
    { 
    MakeName = "Toyota"; 
    ModelName = "Camry"; 
    NumberOfDoors = 4; 
    etc... 
    } 
    else if(cmt == CarModelTypes.2013_Ford_Mustang_GT) 
    { 
    MakeName = "Ford"; 
    ModelName = "Mustang"; 
    NumberOfDoors = 2; 
    etc 
    } 
    else if(etc... 
} 

我把它放到一個單獨的函數,但你明白了。不知道我喜歡那樣。感覺醜陋。後來我想我可以爲從CarModel繼承每個汽車模型類型創建一個類,他們可以實例化自己,所以:

public class Car2015ToyotaCamryLE : CarModel 
{ 
    string MakeName = "Toyota"; 
    string ModelName = "Camry"; 
    int NumberOfDoors = 4 
    etc 

    public Car2015ToyotaCamryLE() 
    { 
    } 
} 

但是好像我真正這裏做的是創建類的實例作爲類本身,根本感覺不對。增加的班級數量可能會增加。即使我們保留了20個模型,這個項目中仍然有20個額外的類。

所以,這就是爲什麼我在這裏。任何人都有一個清晰的方法來處理這個問題,或者任何人都知道專門爲此設計的模式?否則,我可能會選擇第一個選項。

感謝

+3

大廈汽車似乎是一個[汽車廠]完美的工作(http://en.wikipedia.org/wiki/Factory_method_pattern) – theMayer

+1

您需要將數據存儲在數據存儲結構。就這麼簡單。創建類來存儲數據是一個可怕的想法,因爲它使得項目完全無法管理。 2016款車型發佈時會發生什麼?如果你絕對不能將數據存儲在數據庫中,那麼把它存儲在一個漂亮的精簡json結構中怎麼樣? –

+0

你打算如何處理汽車?您是否有機會擁有相同車型的多個實例?你會根據模型做不同的事情嗎?你確定你無法將數據保存在任何地方嗎? – Dzyann

回答

2

過去看你的需求明顯古怪,這是factory method pattern的一個明顯例子。

你的例子在中間大約一半是對工廠模式的確切反模式。如果你看看我上面鏈接的文章,你會看到以下內容。這看起來可以達到您的要求,並且將這些信息存儲在類文件中是完全可以接受的,儘管後來更改它們會變得更加困難(不確定這個例子中是否有必要說明)。

public interface ICar 
{ 
    string GetMake(); 
    string GetModel(); 
} 

public class ToyotaCamry : ICar 
{ 
    #region ICar Members 

    public string GetMake() 
    { 
     return "Toyota"; 
    } 

    public string GetModel() 
    { 
     return "Camry"; 
    } 

    #endregion 
} 

public class FordMustang : ICar 
{ 
    #region ICar Members 

    public string GetMake() 
    { 
     return "Ford"; 
    } 

    public string GetModel() 
    { 
     return "Mustang"; 
    } 
    #endregion 
} 

public enum CarType 
{ 
    FordMustang, 
    ToyotaCamry 
} 

/// <summary> 
/// Implementation of Factory - Used to create objects 
/// </summary> 
public class Factory 
{ 
    public ICar GetCar(CarType type) 
    { 
     switch (type) 
     { 
      case CarType.FordMustang : 
       return new FordMustang(); 
      case CarType.ToyotaCamry: 
       return new ToyotaCamry(); 
     } 
     return null; 
    } 
} 
+0

你知道,我想你是對的。 (在上面的汽車廠評論lol)。我不喜歡這個,原因有兩個:1)應用程序中的類的數量可能會很大(儘管對於我的用例來說它仍然只是20)。 2)感覺像這些是類的實例,而是自己成爲一個類。即當我認爲工廠模式時,我認爲更通用的類型,因爲它們更具體,但似乎可以接受更具體的類型。謝謝 – Nullqwerty

+0

那麼,你必須記住這是他們開發數據庫的原因之一。如果您絕對需要程序功能,那麼類別差異確實是有意義的。現在的趨勢是使用匿名/動態類對象(例如JSON)並放棄類型安全。 – theMayer