web-dev-qa-db-ja.com

クラスファクトリーとは正確には何ですか?

私はWordが頻繁に飛び交うのを目にしており、コードやライブラリーで自分自身が時間をかけてそれを使用した可能性がありますが、実際に使用したことはありません。私が遭遇したほとんどの記事では、彼らはあなたがそれを理解することを期待し続けました。

クラスファクトリーとは何ですか?誰かがコンセプトを説明できますか?

32
Olaseni

クラスファクトリは、他のクラスのインスタンスを構築します。通常、それらが作成するクラスは共通の基本クラスまたはインターフェースを共有しますが、派生クラスが返されます。

たとえば、データベース接続文字列を受け取り、IDbConnectionなどのSqlConnectionを実装するクラス(.Netのクラスとインターフェイス)を返すクラスファクトリを作成できます。

14
Rowland Shaw

以下は、技術的には正しいものの、他の短いもののいくつかをよりよく理解するのに役立つ補足情報です。

厳密に言うと、クラスファクトリは、クラスを作成または選択し、入力パラメーターまたはグローバルコンテキストから決定された条件に基づいてクラスを返す関数またはメソッドです。これは、必要なオブジェクトのtypeが実行時まで判別できない場合に必要です。クラス自体がPythonなどの使用されている言語のオブジェクトである場合、実装は直接行うことができます。

すべてのクラスの主な用途はそれ自体のインスタンスを作成することであるため、クラスが渡されたり操作されたりするオブジェクトではないC++などの言語では、「仮想コンストラクタ」をシミュレートして同様の結果を得ることができます。基本クラスのコンストラクタですが、いくつかの派生クラスのインスタンスを取得します。コンストラクタは実際には virtual にはなれないため、これはシミュレーションする必要があります。 C++では、このようなobject—クラスではなく—ファクトリは通常、スタンドアロン関数または静的メソッドとして実装されます。

オブジェクトファクトリの使用は単純で単純なスキームですが、基本クラスのmake_object()関数でサポートされているすべての型のリストを手動で保守する必要があります。これは、エラーが発生しやすく、手間がかかります。 (見落とされていない場合)。また、カプセル化にも違反しています✶✶ なぜなら、基底クラスのメンバーは、基底の具体的な子孫クラス(現在および将来)のすべてを知っている必要があるからです。

仮想関数は通常、参照されるオブジェクトの実際のタイプによって「 late 」に解決されますが、コンストラクターの場合、オブジェクトはまだ存在しないため、他の方法でタイプを判別する必要があります。
✶✶カプセル化 は、クラスと関数のセットの設計のプロパティであり、特定のクラスまたは関数はその中に隠されており、オブジェクト指向プログラミングの特徴の1つです。

したがって、最良/理想的な実装は、新しい候補クラスが追加されたときに自動的にを処理できるものであり、現在工場にハードコーディングされている特定の有限セットだけではありません(ただし、工場は変更が必要な唯一の場所であるため、-offはしばしば許容できると見なされます。

James Coplienの1991年の本 Advanced C++:Programming Styles and Idioms に詳細がありますC++でこのような仮想ジェネリックコンストラクターを実装する1つの方法。 C++テンプレート を使用してこれを行うより良い方法がありますが、標準の言語定義に追加される前の本には含まれていません。実際、C++テンプレートは、異なる実際の型引数で呼び出されるたびに新しいクラスをインスタンス化するため、それ自体がクラスファクトリです。 更新:というタイトルの、EuroPLoP向けにCoplienが書いた1998年の論文を見つけました。 C++イディオム ここで、彼は本のイディオムを改訂して1994年のデザインパターン形式に再編成しました 設計パターン:再利用可能なオブジェクト指向ソフトウェアの要素 本。特に Virtual Constructor セクション(彼の Envelope/Letter パターン構造を使用)に注意してください。

Pythonのクラスファクトリー に関する関連する回答と、2001年のドブドクターのC++テンプレートでの実装に関する記事 Abstract Factory、テンプレートスタイル

30
martineau

クラスファクトリは、(たとえば、いくつかのパラメータに従って)カスタマイズされたクラス(インスタンス化されていない!)を返すメソッドです。

5
ChristopheD

これでかなりうまくいくと感じました(とにかく私にとって)。工場の設計パターンにはクラスファクトリーが使われていると思います。

他の作成パターンと同様に、[ファクトリデザインパターン]は、作成されるオブジェクトの正確なクラスを指定せずにオブジェクト(製品)を作成する問題を扱います。ファクトリメソッドデザインパターンは、オブジェクトを作成するための個別のメソッドを定義することによってこの問題を処理します。サブクラスは、オーバーライドされて、作成される製品の派生型を指定できます。より一般的には、ファクトリメソッドという用語は、オブジェクトの作成を主な目的とするメソッドを指す場合によく使用されます。

http://en.wikipedia.org/wiki/Factory_method_pattern

すでにこれを読んで不十分であるとわかった場合はお詫びします。

2
Matthew H

ウィキペディアの記事はかなり良い定義を与えています: http://en.wikipedia.org/wiki/Factory_pattern

しかし、おそらく最も信頼できる定義は、GammaらによるDesign Patternsの本にあります。 (一般に「ギャングオブフォーブック」と呼ばれます)。

2
Will