5

基本クラスへの一連のポインターを保持するコンテナーと、入力を受け取り、基本クラスのサブクラスであるクラスを返す関数があります。どのサブクラスを返すかは、入力によって異なります。

現在、次のような巨大なswitchステートメントがあります。

class Base { ... }

class A : public Base { ... }
class B : public Base { ... }
...
class Z : public Base { ... }

Base* depends(int input) {
    switch (input) {
    case 1:
        return new A(...);
    case 2:
        return new B(...);
    ...
    case 26:
        return new Z(...);
    default:
        ...
    }
}

これを設計するためのより良い方法があるかどうか疑問に思いました。私は多くの「デザインパターン」を知らないので(それが彼らの名前だと思います)、これをデザインするための(明らかな)より良い方法があるかどうかはわかりません。

4

4 に答える 4

6

探しているのはファクトリメソッドパターンです。

ここで重要なことは、Baseクラスが派生クラスの実装に関する知識を持つ必要をなくすことです。基本クラスが派生クラスについての知識を持つことは悪い設計です。

ファクトリメソッドパターンは、作成がBaseクラスの外部で行われるため、上記の問題に対処します。

于 2011-07-16T05:53:40.337 に答える
1

これで何を意図しているのかを理解するのは少し難しいですが、入力パラメーターに基づいてさまざまなサブクラスを多数作成する場合は、Abstract Factory パターンを検討することをお勧めします。

于 2011-07-16T05:48:57.903 に答える
1

別の方法は、対応するコンストラクターを呼び出す関数へのポインターを配置する配列を作成することです。そして、depends() では、指定された入力によって必要な関数のみを呼び出します。ただし、このアプローチでは26個の関数が必要です

于 2011-07-16T05:49:28.777 に答える
1

整数パラメータ「入力」はどこかから来ています。代わりに、その int を作成したコードに実際のオブジェクトを作成させることができる場合があります。ディスクなどからintを読み取っている場合、それは機能しません。

さまざまなサブクラスがそれらを作成するオブジェクトに登録する状況を設定することを検討してください。その場合、ファクトリ オブジェクトはコンパイル時にサブクラスについて知る必要はありません。コンストラクターが各サブクラスの登録を行うグローバル変数を使用して、起動時にこれを行うことができます。switch ステートメントはよりシンプルで高速ですが、サブクラスを変更するときにスイッチを最新の状態に保つ必要があることを意味します。それはトレードオフであり、あなたのソリューションがより精巧なソリューションよりも必ずしも劣っているとは思いません。

于 2011-07-16T06:27:28.127 に答える