Прошлой ночью я столкнулся с затруднительным положением при проектировании фабрики объектов и подумал, что я бы попросил совета.
По сути, мой «CameraFactory» возвращает указатели на классы, основанные на доступных типах, таких как «FIXED» или «FREE» (и многое другое, но этот пример будет коротким). Все это наследуется от CameraBase.
Однако моя проблема заключается в том, что поскольку класс CameraBase имеет очень ограниченную реализацию, пользователю необходимо выполнить static_cast<typeOfCameraRequested*>(returned CameraBaseDerivative*);
на возвращенном указателе.
Я чувствую, что принуждение пользователя «запоминать» статическое приведение приводит к плохой практике (кстати, я не использую необработанные указатели в реальной реализации). Но, насколько я понимаю, единственный другой способ создать «аккуратную» фабричную реализацию — это включить интерфейс ко всем членам / методам производных классов в CameraBase, чтобы их можно было легко вызывать.
Пожалуйста, кто-нибудь может пролить свет на лучший подход к этому вопросу? Должен ли я изменить дизайн моих классов? Если так, то как это должно выглядеть? Дженерики?
Спасибо!
Код для рассмотрения:
Class CameraBase {
protected:
SomeDataMember mDataMember;
}
Class FreeCamera : public CameraBase {
public:
void SomeFreeCameraSpecificMethod();
}
class StaticCamera: public CameraBase {
public:
void SomeStaticCameraSpecificMethod();
}
Class CameraFactory {
public:
static BaseCamera* createCamera(CameraTypeEnum _type) {
switch (_type) {
case FREE:
return createFreeCamera();
break;
case STATIC:
return createStaticCamera();
break;
}
}
}
FreeCamera* freeCam = static_cast<FreeCamera*>(CameraFactory::createCamera(FREE));
Задача ещё не решена.
Других решений пока нет …