Одна вещь, которую вы можете сделать, это передать ее конструктору, например:
class CMyFactory
{
public:
virtual CMyObject* MakeObject(ObjectType type, ParamType param);
}
CMyObject* CMyFactory::MakeObject(ObjectType type, ParamType param)
{
CMyObject* newObject = NULL;
switch (type)
{
case type1:
newObject = new CType1Object(param);
break;
case type2:
newObject = new CType2Object(param);
break;
// Other cases here
}
return newObject;
}
Вы можете перегрузить MakeObject в соответствии с типом параметра, например так:
class CMyFactory
{
public:
virtual CMyObject* MakeObject(ObjectType type, ParamType param);
virtual CMyObject* MakeObject(ObjectType type, OtherParamType param);
}
CMyObject* CMyFactory::MakeObject(ObjectType type, ParamType param)
{
CMyObject* newObject = NULL;
switch (type)
{
case type1:
newObject = new CType1Object(param);
break;
case type2:
newObject = new CType2Object(param);
break;
// Other cases here
}
return newObject;
}
CMyObject* CMyFactory::MakeObject(ObjectType type, OtherParamType param)
{
CMyObject* newObject = NULL;
switch (type)
{
case type3:
newObject = new CType3Object(param);
break;
case type4:
newObject = new CType4Object(param);
break;
// Other cases here
}
return newObject;
}
Такиеу подхода есть недостаток, заключающийся в том, что пользователь вашей фабрики должен знать, какой параметр ему нужно передать для какого типа объекта, который будет создан, но в любом случае это, вероятно, неизбежно при таком подходе.
Я думаю, что я мог бы передать данные после создания объекта, но это не очень хорошо с Фабрикой.Идея фабричного метода состоит в том, чтобы поместить логику создания объекта только в одном месте.Поэтому, если мне придется иметь дело с классами, зависящими от типа объекта, то нет особой разницы в создании объекта непосредственно того типа, который я хочу.
Я согласен: вам не нужно передавать данныена объект после создания.Это равносильно двухэтапному созданию, которое как бы побеждает цель.
Использование фабричного метода не только скрывает способ создания объекта, но и может скрывать фактический тип созданного объекта.,Классическим примером является WidgetFactory
, который будет создавать все виды виджетов, но всегда будет возвращать Widget*
, позволяющий вашему коду использовать преимущества полиморфизма при работе с созданным виджетом, и позволяющий разработчику библиотеки изменять реализацию, стоящую засцены без нарушения кода клиента