プロが教えるわが家の防犯対策術!

デザインパターンのファクトリークラスを利用してみるため、下記のサイトをもとにプログラミングをしました。

http://hccweb1.bai.ne.jp/tsune-1/CSharp/factory. …

そこで、きになったのですが、上記のようにCreateProductでIdCard を返した場合、
イメージとしては、下記のようになると思います。
Product prd = new IdCard ();

この場合、IdCard ないの、publicの変数は他のクラスから参照できなくなってしまいますよね。
もちろん、IdCard prd = new IdCard とすれば、ほかのクラスから参照できるのとおもいます。

そうすると、IdCard の変数をほかのクラスから参照したい場合は、ファクトリークラスを用いるのはむいてないということでしょうか。あるいは、私が何か勘違いをしていますか?

A 回答 (1件)

 このパターンは、あらゆる種類のプロダクトが存在する。

どんなプロダクトを作成するかは、クラスユーザーが関与するところではない。どんな種類のプロダクトが返されてきても、インターフェースは常に一定である。という場合に、効力を発揮します。

 この場合ですと、IdCardというクラスは、クラス名も含めて、内部実装であり、Pruductクラスユーザーが関与するところでないと言うことです。
 Idの識別手段には、Simonとか、Kousaiとかいろいろあって、その時々にどれが使われたかは、内部データベースやそのほかの手段で識別され、その識別の手段をプログラム側では関与する必要が無い。つまり、プログラムから、その識別手段に関する情報を完全に切り離すといった場合に、効果を発揮します。
 つまり、プログラムからは、正しい識別手段のクラスが手に入り、Useさえ出来ればそれで良いのです。それ以外のことは全て、内部実装であり、プログラムからは手を出してくれるなと言いたいわけです。

 もちろん、それ以外のインターフェースが必要であれば、それは、Productで定義されているべきです。

 具体例ですと、例えば、ファイルオブジェクトを作成するファクトリークラスがあるとしましょう。ファイル名を指定するとファイルオブジェクトを返してくれます。でも、この「ファイル」なるものの実態が、USBメモリーのファイルとハードディスクのファイルと、ネットワークドライブのファイルで全部違うクラスが定義されているとします。
 プログラムとしては、ファイルのパスを与えれば、ファイルの読み書きが出来るオブジェクトが手に入ればそれで良いのです。それ以上のことは全て内部実装でかまわない。ファイルがUSBにあろうがハードディスクにあろうがそんなことはどうでも良いことであり、返されたオブジェクトがネットワーク用だろうがUSBメモリー用クラスであろうが、そんなことは知るつもりさえないです。
 ファクトリークラスが力を発揮するのはこういう時です。

 ファクトリークラスは、自分で、ファイル名を解析し、必要に応じて、システム設定を参照し、そのファイルがUSBにあるのか、ネットワークにあるかを判断し、そのファイル用の適切なクラスのファイルオブジェクトを返す。
 そのオブジェクトを手に入れたプログラム側は、そのクラスが本当は何であるかはお構いなしに、単にファイルオブジェクトとして全ての操作をする。
 
 別に、ネットワークファイルオブジェクトクラスに、public変数としてipアドレスなんてプロパティーがあったとしても別に使う必要は無いですよね。
 これが、隠蔽とか分離とかいう考え方です。
 こうしておけば、ある日、ipv4のアドレスが使い尽くされ、ipv6になったとしても、ファイルクラス群はファイルオブジェクトのユーザーのことは何も考えずに、書き換えることも、クラスを追加することも出来ます。この更新の時に唯一守らなければならないのは、ファイルオブジェクトに定義されたインターフェースを維持すること。ただそれだけで済みます。
    • good
    • 0
この回答へのお礼

詳しい説明をありがとうございます。
ユーザーが関与したい場合(私は関与したい)、今までどおりに普通に継承したクラスを宣言すればいいわけですね。何か新しいテクニックを用いたかったため、書いてみたのですが、適用できなさそうなので残念です。

お礼日時:2013/07/25 15:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!