我有類Foo
,它有多個構造函數。更好的模式選擇構造函數
class Foo
{
public:
Foo(Param1, Param2);
Foo(Param1, Param3, Param4);
Foo(Param1, Param4);
Foo(Param1, Param2, Param4);
}
PARAMS構造器的實際列表大,我不想提供訪問這些構造直接從其他項目(否則我也需要出口這4個構造函數)。我知道最好的模式,以避免這種多重構造是Builder Pattern。但是,這會給這個類的客戶造成混淆,哪些參數是可選的,哪些參數不是。另外每個構造函數都根據參數進行一定的驗證。所以在實際使用這個對象的任何方法之前,我需要通用的地方來做這樣的驗證。
所以目前我們正在開發的是如下的內容:
沒有變化
Foo
類。定義
FooParam
結構struct FooParam { Param1 p1; Param2 p2; Param3 p3; Param4 p4; }
廠:
Foo* CreateFoo(FooParams& foo) { if(foo.Param2) { if(foo.Param4) { return new Foo(foo.param1, foo.param2, foo.param4); } else return new Foo(foo.param1, foo.param2); } else if(foo.param4) { if(foo.param3) return new Foo(foo.param1, foo.param3, foo.param4); else return new Foo(foo.param1, foo.param4); } throw new Exception("Invalid Parameter"); }
我想我們可以在第3步中做的更好,但現在知道怎麼辦?
param1 ....的數據類型是什麼? –
還有默認值的選項 –
多重構造函數的優點是非常清楚哪些參數放在一起。 'struct FooParam'似乎使一切變得複雜。爲什麼你不能導出構造函數? – Gene