昨夜、オブジェクト ファクトリを設計しているときに困惑に遭遇したので、ここでガイダンスを求めようと思いました。
基本的に、私の「CameraFactory」は、「FIXED」や「FREE」などの使用可能なタイプに基づいてクラスへのポインターを返します (その他の例もありますが、この例は短くします)。これらはすべて CameraBase を継承しています。ただし、私の問題は、 CameraBase クラスの実装が非常に限られているため、ユーザーstatic_cast<typeOfCameraRequested*>(returned CameraBaseDerivative*);
は返されたポインターに対して a を実行する必要があることです。
ユーザーに静的キャストを「覚えておく」ように強制することで、結果は悪い習慣だと思います(実際の実装では生のポインターを使用していません)。しかし、私の理解では、「きちんとした」ファクトリ実装を作成する他の唯一の方法は、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));