двухшаговая инициализация
|
|
Понедельник, 03 Августа 2020 г. 10:45
+ в цитатник
Twilight:
Qraizer я понимаю, что в данном случае это не совсем "эталонный" фабричный метод, но его всегда можно переписать следующим образом
IObject* create( int type, const ObjectData &objectData )
{
IObjectData *result = nullptr;
if( type == 1 ) result = new Object1;
else result = new Object2;
result->initialize( objectData );
return result;
}
В реальном коде вызовов initialize вынесен из метода create() в силу архитектуры ПО и контракта с прикладной частью.
Что касается перегрузки конструкторов или создание с помощью дружественных методов: в моем случае ObjectData это один тип, с помощью которого инициализируются все типы объектов. В 99% случаев там нет данных, которые относились бы к Object1 и не относились бы к Object2. Получается, что разделение ObjectData на части CommonObjectData и Object1Data, Object2Data будет несколько искусственным. В дополнение, в один момент времени существуют только один экземпляр IObject ( по-факту - это работа с подключенным железом )
JoeUser если честно я не совсем понял, твое предложение. Оно выглядит как усложненный вариант 1, но не решающее его проблему: хранение в классе указателя на BaseData
https://forum.sources.ru/index.php?showtopic=419313&view=findpost&p=3835746
Метки:
C/C++:
Общие вопросы
-
Запись понравилась
-
0
Процитировали
-
0
Сохранили
-