5

我有一個容器,它包含一堆指向基類的指針,以及一個函數,它接受一些輸入並返回一個類,它是基類的一個子類。它返回哪個子類取決於輸入。構造函數的巨型開關語句

現在,我有一個巨大的switch語句是這樣的:

class Base { ... } 

class A : public Base { ... } 
class B : public Base { ... } 
... 
class Z : public Base { ... } 

Base* depends(int input) { 
    switch (input) { 
    case 1: 
     return new A(...); 
    case 2: 
     return new B(...); 
    ... 
    case 26: 
     return new Z(...); 
    default: 
     ... 
    } 
} 

我想知道是否有任何更好的方法來設計這個。我不知道許多「設計模式」(我認爲這就是他們所稱的),所以我不知道是否有一個(明顯的)更好的設計方法。

+1

將字典映射到類或類名(如果您的鍵是整數,只是一個數組),這將是一件好事。但是這可能嗎?看到類似的問題:http://stackoverflow.com/questions/582331/c-is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name –

+0

@Ray謝謝對於這個鏈接來說,這個問題與我的非常相似,並且幾乎回答了這個問題。 –

回答

6

你在找什麼是Factory Method pattern

這裏重要的是消除基類對衍生類實現的任何知識的需求。對於一個Base類來說,瞭解Derived類是一個糟糕的設計。

工廠方法模式解決了上述問題,因爲創建發生在基類之外。

1

它有點難以計算出你打算如何使用它,但是如果你想根據一些輸入參數創建一堆不同的子類,你可能需要考慮抽象工廠模式。

1

另一種方法是創建一個數組,其中您將指向將調用相應構造函數的函數的指針。在你的depends()中,你只會通過給定的輸入調用你需要的函數。但任何方式,你需要在這種方法26功能

1

整數參數「input」來自某處。您可能會讓創建該int的代碼創建實際的對象。如果你從磁盤讀取int或類似的東西,這將不起作用。

您可能會考慮設置一種情況,其中不同的子類向創建它們的對象註冊自己。在這種情況下,工廠對象在編譯時不需要知道子類。你可以在啓動時使用全局變量來完成這些工作,這些全局變量的構造函數爲每個子類進行註冊。您的switch語句更簡單快捷,但它意味着您必須在更改子類時保持開關處於最新狀態。這是一種折衷,我不認爲你的解決方案肯定不如一個更精細的解決方案。

+0

不幸的是,這正是這個程序所做的 - 從文件中讀取數據。這個程序需要獲得儘可能高的效率,所以我認爲堅持使用「switch」將是一個很好的選擇。謝謝。 –

+0

@Seth Carnegie你可能想要做的一件事是讓子類定義一個像classId這樣的靜態常量字段。然後創建該對象的代碼和將該ID寫入磁盤的代碼都可以引用相同的字段。 –

+0

是的,就是這樣。我寧願那樣做RTTI。 –