- ベストアンサー
C#でファクトリークラスの使い方
- C#でデザインパターンのファクトリークラスを使う方法について紹介します。
- 具体的な例として、以下のサイトを参考にプログラミングを行いました。
- ファクトリークラスを使用する際に、注意が必要な点についても説明します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
このパターンは、あらゆる種類のプロダクトが存在する。どんなプロダクトを作成するかは、クラスユーザーが関与するところではない。どんな種類のプロダクトが返されてきても、インターフェースは常に一定である。という場合に、効力を発揮します。 この場合ですと、IdCardというクラスは、クラス名も含めて、内部実装であり、Pruductクラスユーザーが関与するところでないと言うことです。 Idの識別手段には、Simonとか、Kousaiとかいろいろあって、その時々にどれが使われたかは、内部データベースやそのほかの手段で識別され、その識別の手段をプログラム側では関与する必要が無い。つまり、プログラムから、その識別手段に関する情報を完全に切り離すといった場合に、効果を発揮します。 つまり、プログラムからは、正しい識別手段のクラスが手に入り、Useさえ出来ればそれで良いのです。それ以外のことは全て、内部実装であり、プログラムからは手を出してくれるなと言いたいわけです。 もちろん、それ以外のインターフェースが必要であれば、それは、Productで定義されているべきです。 具体例ですと、例えば、ファイルオブジェクトを作成するファクトリークラスがあるとしましょう。ファイル名を指定するとファイルオブジェクトを返してくれます。でも、この「ファイル」なるものの実態が、USBメモリーのファイルとハードディスクのファイルと、ネットワークドライブのファイルで全部違うクラスが定義されているとします。 プログラムとしては、ファイルのパスを与えれば、ファイルの読み書きが出来るオブジェクトが手に入ればそれで良いのです。それ以上のことは全て内部実装でかまわない。ファイルがUSBにあろうがハードディスクにあろうがそんなことはどうでも良いことであり、返されたオブジェクトがネットワーク用だろうがUSBメモリー用クラスであろうが、そんなことは知るつもりさえないです。 ファクトリークラスが力を発揮するのはこういう時です。 ファクトリークラスは、自分で、ファイル名を解析し、必要に応じて、システム設定を参照し、そのファイルがUSBにあるのか、ネットワークにあるかを判断し、そのファイル用の適切なクラスのファイルオブジェクトを返す。 そのオブジェクトを手に入れたプログラム側は、そのクラスが本当は何であるかはお構いなしに、単にファイルオブジェクトとして全ての操作をする。 別に、ネットワークファイルオブジェクトクラスに、public変数としてipアドレスなんてプロパティーがあったとしても別に使う必要は無いですよね。 これが、隠蔽とか分離とかいう考え方です。 こうしておけば、ある日、ipv4のアドレスが使い尽くされ、ipv6になったとしても、ファイルクラス群はファイルオブジェクトのユーザーのことは何も考えずに、書き換えることも、クラスを追加することも出来ます。この更新の時に唯一守らなければならないのは、ファイルオブジェクトに定義されたインターフェースを維持すること。ただそれだけで済みます。
お礼
詳しい説明をありがとうございます。 ユーザーが関与したい場合(私は関与したい)、今までどおりに普通に継承したクラスを宣言すればいいわけですね。何か新しいテクニックを用いたかったため、書いてみたのですが、適用できなさそうなので残念です。