我有一個'銀行'類和'分支'類。 「分行」是從「銀行」繼承的。我只想允許「銀行」對象創建新的「分支」對象。 (例如,只有Citi集團可以開設新的Citi銀行分行)。如何限制創建某些類的對象
什麼是實現這一目標的最佳設計模式?
我目前正在使用私人構造函數的朋友類。但我不確定這是否是正確的做法。
我有一個'銀行'類和'分支'類。 「分行」是從「銀行」繼承的。我只想允許「銀行」對象創建新的「分支」對象。 (例如,只有Citi集團可以開設新的Citi銀行分行)。如何限制創建某些類的對象
什麼是實現這一目標的最佳設計模式?
我目前正在使用私人構造函數的朋友類。但我不確定這是否是正確的做法。
'分公司' 從 '銀行'
有你的問題,你使用繼承繼承。您正在尋找抽象工廠模式,其中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*
回來,但它會指向一個正確的具體對象。
這將起作用。我也使用了類似模式的朋友和私人構造函數。我也使用繼承,因爲'分支'共享'銀行'的許多屬性,如標誌,任務說明... – apostopher 2012-08-01 19:01:57
@apostopher這是不必要的信息重複,因爲你會有很多分支具有相同的信息。我只是將這些信息保存在Bank類中,並讓它可以訪問分支機構,而不是繼承它。 – 2012-08-01 19:11:26
你是個不錯的主意。我同意@DavidRodríguez。所以繼承是錯誤的。 – apostopher 2012-08-01 19:20:14
這似乎是合理的。 – Chad 2012-08-01 18:40:18
你確定你確實想要這麼做嗎?它會讓編寫'Branch'測試變得更困難嗎?也許你想要的僅僅是讓'Branch'構造函數以'Bank'作爲參數? – 2012-08-01 18:40:52
是的測試會更困難..但是,然後任何代碼可以指定任何分支到任何銀行..這就是我想限制的。 – apostopher 2012-08-01 18:43:36