2012-08-01 61 views
2

我有一個'銀行'類和'分支'類。 「分行」是從「銀行」繼承的。我只想允許「銀行」對象創建新的「分支」對象。 (例如,只有Citi集團可以開設新的Citi銀行分行)。如何限制創建某些類的對象

什麼是實現這一目標的最佳設計模式?

我目前正在使用私人構造函數的朋友類。但我不確定這是否是正確的做法。

+0

這似乎是合理的。 – Chad 2012-08-01 18:40:18

+0

你確定你確實想要這麼做嗎?它會讓編寫'Branch'測試變得更困難嗎?也許你想要的僅僅是讓'Branch'構造函數以'Bank'作爲參數? – 2012-08-01 18:40:52

+1

是的測試會更困難..但是,然後任何代碼可以指定任何分支到任何銀行..這就是我想限制的。 – apostopher 2012-08-01 18:43:36

回答

2

'分公司' 從 '銀行'

有你的問題,你使用繼承繼承。您正在尋找抽象工廠模式,其中Bank是分支創建者,並且僅向其各自的創建者提供對分支構造函數的訪問。

struct Branch //abstract 
{ 
    virtual ~Branch() = 0; 
}; 
class CitiBranch : Branch 
{ 
    friend class Citi; //only Citi can create instances of CityBranch 
private: 
    CitiBranch(); 
}; 

struct Bank 
{ 
    virtual ~Bank() = 0; 
    virtual Branch* createBranch() = 0; 
} 

struct Citi : Bank 
{ 
    virtual Branch* creatBranch() 
    { 
     return new CityBranch; 
    } 
} 

這個程序是一個接口而不是具體的類。所以你有Branch指針和Bank指針,並不需要知道它們的確切類型。

如果你有一個Bank*並致電createBranch(),你會得到一個Branch*回來,但它會指向一個正確的具體對象。

+0

這將起作用。我也使用了類似模式的朋友和私人構造函數。我也使用繼承,因爲'分支'共享'銀行'的許多屬性,如標誌,任務說明... – apostopher 2012-08-01 19:01:57

+1

@apostopher這是不必要的信息重複,因爲你會有很多分支具有相同的信息。我只是將這些信息保存在Bank類中,並讓它可以訪問分支機構,而不是繼承它。 – 2012-08-01 19:11:26

+0

你是個不錯的主意。我同意@DavidRodríguez。所以繼承是錯誤的。 – apostopher 2012-08-01 19:20:14

相關問題