C ++でファクトリメソッドパターンを正しく実装する方法
簡単に聞こえますが、正直に言うとどうすればいいのかわからないので、C ++には長い間不快に感じていたものが1つあります。 C ++でFactoryメソッドを正しく実装するにはどうすればよいですか? 目標:許容できない結果やパフォーマンスへの影響なしに、クライアントがオブジェクトのコンストラクタの代わりにファクトリメソッドを使用してオブジェクトをインスタンス化できるようにすること。 「ファクトリー・メソッド・パターン」とは、オブジェクト内の静的なファクトリー・メソッドまたは別のクラスで定義されたメソッド、またはグローバル関数の両方を意味します。一般的には、「クラスXのインスタンス化の通常の方法をコンストラクター以外の場所にリダイレクトするという概念」です。 私が考えたいくつかの可能な答えをざっと見てみましょう。 0)工場を作らず、コンストラクタを作る。 これは良さそうですが(実際、多くの場合は最善の解決策です)、一般的な解決策ではありません。まず、オブジェクトの構築が別のクラスへの抽出を正当化するのに十分複雑なタスクである場合があります。しかし、その事実はさておき、コンストラクターだけを使用する単純なオブジェクトの場合でさえ、多くの場合そうしません。 私が知っている最も簡単な例は、2-D Vectorクラスです。とてもシンプルですが、トリッキーです。デカルト座標と極座標の両方から構築できるようにしたいと考えています。明らかに、私はできません: struct Vec2 { Vec2(float x, float y); Vec2(float angle, float magnitude); // not a valid overload! // ... }; 私の自然な考え方は次のとおりです。 struct Vec2 { static Vec2 fromLinear(float x, float y); static Vec2 fromPolar(float angle, float magnitude); // ... }; これは、コンストラクターの代わりに、静的ファクトリーメソッドの使用につながります...これは、本質的に、何らかの方法でファクトリーパターンを実装していることを意味します(「クラスが独自のファクトリーになる」)。これは見栄えがよく(この特定のケースに適しています)、場合によっては失敗します。これについては、ポイント2で説明します。 …