我必須根據客戶類型創建對象族。 我有一個基本的抽象類ApplicationRulesFactory,它定義了 虛擬接口。許多具體的客戶類從這個類繼承。具有默認實現的抽象工廠設計模式
問題是,對於某些客戶說CustomerB我們不使用對象Rule2和Rule3,因爲應用程序中使用這些對象Rule2和Rule3的功能在該客戶的應用程序用戶界面中被禁用,所以我們根本不需要實例化這些對象。
簡化的代碼是在這裏,即在現實ApplicationRulesFactory有更多的虛方法,並且更具體的客戶分類,從它繼承:
class ApplicationRulesFactory
{
virtual Rule1* GetRule1() = 0;
virtual Rule2* GetRule2() = 0;
virtual Rule3* GetRule3() = 0;
.....
};
class ACustomerRulesFactory : public ApplicationRulesFactory
{
Rule1* GetRule1()
{
return new ACustomerRule1();
}
Rule2 * GetRule2()
{
return new ACustomerRule2();
}
Rule3* GetRule3()
{
return new ACustomerRule3();
}
};
class BCustomerRulesFactory : public ApplicationRulesFactory
{
Rule1* GetRule1()
{
return new BCustomerRule1();
}
Rule2* GetRule2() // not needed
{
// what to return here ?
}
Rule3* GetRule3() // not needed
{
// what to return here ?
}
};
所以,我應該如何去實現這一點:
1)在基類ApplicationRulesFactory中返回一些默認實現:
class ApplicationRulesFactory
{
virtual Rule1* GetRule1() = 0;
virtual Rule2* GetRule2() { return new Rule2DefaultImpl();}
virtual Rule3* GetRule3() { return new Rule3DefaultIml();}
};
但是這似乎是錯誤的,要繼承新類(Rule1D eruptImpl,Rule2DefaultImpl)Rule1,Rule2,並且很可能使它們只用於執行空白的目的,就像ApplicationRulesFactory中的默認實現一樣。2)或者在具體類中返回默認實現並保留這些方法純虛擬在基類
class BCustomerRulesFactory : public ApplicationRulesFactory
{
Rule1* GetRule1()
{
return new BCustomerRule1();
}
Rule2* GetRule2()
{
return new Rule2DefaultImpl();
}
Rule3* GetRule3()
{
return new Rule3DefaultImpl();
}
};
這些解決方案也似乎很醜陋,重新定義在每一個具體的客戶類中的方法,雖然他們不需要。我也有一種感覺,也許我不應該這樣使用繼承,因爲這違反了IS-A的繼承規則,導致大量的方法不適用於所有具體的客戶類,但是如果沒有繼承,不要去實現這個。
任何想法
他們的指針,你能不能只返回NULL?在設計方面,客戶A和B是不同類型的客戶,因此可能會有兩個子類,一個規則是一個,另一個是3. – parkydr
是的,我可以,但仍然懷疑這是正確的做法。 – user152508