デザインパターンのファクトリークラスを利用してみるため、下記のサイトをもとにプログラミングをしました。
http://hccweb1.bai.ne.jp/tsune-1/CSharp/factory. …
そこで、きになったのですが、上記のようにCreateProductでIdCard を返した場合、
イメージとしては、下記のようになると思います。
Product prd = new IdCard ();
この場合、IdCard ないの、publicの変数は他のクラスから参照できなくなってしまいますよね。
もちろん、IdCard prd = new IdCard とすれば、ほかのクラスから参照できるのとおもいます。
そうすると、IdCard の変数をほかのクラスから参照したい場合は、ファクトリークラスを用いるのはむいてないということでしょうか。あるいは、私が何か勘違いをしていますか?
No.1ベストアンサー
- 回答日時:
このパターンは、あらゆる種類のプロダクトが存在する。
どんなプロダクトを作成するかは、クラスユーザーが関与するところではない。どんな種類のプロダクトが返されてきても、インターフェースは常に一定である。という場合に、効力を発揮します。この場合ですと、IdCardというクラスは、クラス名も含めて、内部実装であり、Pruductクラスユーザーが関与するところでないと言うことです。
Idの識別手段には、Simonとか、Kousaiとかいろいろあって、その時々にどれが使われたかは、内部データベースやそのほかの手段で識別され、その識別の手段をプログラム側では関与する必要が無い。つまり、プログラムから、その識別手段に関する情報を完全に切り離すといった場合に、効果を発揮します。
つまり、プログラムからは、正しい識別手段のクラスが手に入り、Useさえ出来ればそれで良いのです。それ以外のことは全て、内部実装であり、プログラムからは手を出してくれるなと言いたいわけです。
もちろん、それ以外のインターフェースが必要であれば、それは、Productで定義されているべきです。
具体例ですと、例えば、ファイルオブジェクトを作成するファクトリークラスがあるとしましょう。ファイル名を指定するとファイルオブジェクトを返してくれます。でも、この「ファイル」なるものの実態が、USBメモリーのファイルとハードディスクのファイルと、ネットワークドライブのファイルで全部違うクラスが定義されているとします。
プログラムとしては、ファイルのパスを与えれば、ファイルの読み書きが出来るオブジェクトが手に入ればそれで良いのです。それ以上のことは全て内部実装でかまわない。ファイルがUSBにあろうがハードディスクにあろうがそんなことはどうでも良いことであり、返されたオブジェクトがネットワーク用だろうがUSBメモリー用クラスであろうが、そんなことは知るつもりさえないです。
ファクトリークラスが力を発揮するのはこういう時です。
ファクトリークラスは、自分で、ファイル名を解析し、必要に応じて、システム設定を参照し、そのファイルがUSBにあるのか、ネットワークにあるかを判断し、そのファイル用の適切なクラスのファイルオブジェクトを返す。
そのオブジェクトを手に入れたプログラム側は、そのクラスが本当は何であるかはお構いなしに、単にファイルオブジェクトとして全ての操作をする。
別に、ネットワークファイルオブジェクトクラスに、public変数としてipアドレスなんてプロパティーがあったとしても別に使う必要は無いですよね。
これが、隠蔽とか分離とかいう考え方です。
こうしておけば、ある日、ipv4のアドレスが使い尽くされ、ipv6になったとしても、ファイルクラス群はファイルオブジェクトのユーザーのことは何も考えずに、書き換えることも、クラスを追加することも出来ます。この更新の時に唯一守らなければならないのは、ファイルオブジェクトに定義されたインターフェースを維持すること。ただそれだけで済みます。
詳しい説明をありがとうございます。
ユーザーが関与したい場合(私は関与したい)、今までどおりに普通に継承したクラスを宣言すればいいわけですね。何か新しいテクニックを用いたかったため、書いてみたのですが、適用できなさそうなので残念です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- MySQL 【MySQL】本当に困っているので、助けてください。よろしくお願いします。 3 2023/06/03 14:24
- Excel(エクセル) 別シートに毎回異なるデータをコピーする 7 2022/06/24 09:02
- 学校 至急回答お願いします。 LINEグループの投票をするべきか迷っています。 専門学生です。 3週間前に 2 2022/07/19 20:26
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- 水泳 成人クラスに通おうと思っている水泳初心者です! 1 2023/07/11 21:50
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
DLLからEXEのクラスを呼び出す...
-
(UWSC) 「#32770」の意味わかり...
-
MFCアプリのコマンドラインでパ...
-
ダイアログ表示時にチェックボ...
-
エディットコントロールでEnter...
-
C++/CLIからC++の呼び出しで例外
-
C++ protectedにアクセス不可
-
MRUの一時回避 VC++2008 MFC
-
CMainFrameクラスの使い方
-
IncludeではなくClassで宣言す...
-
このコンパイルエラーの意味に...
-
【C++】vectorについて
-
C#のクラス設計について教えて...
-
イベントにAddHandlerされてい...
-
VC++ リストボックスにデータを...
-
クラスのアドレスを引数として...
-
オブジェクト指向 集約の実装...
-
SetTimerの行でアサートエラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
エディットコントロールのイベ...
-
エディットコントロールでEnter...
-
WindowsAPIのリストビューの...
-
CMainFrameクラスの使い方
-
DebugクラスとTraceクラスの違い
-
MessageBoxを継承したい
-
C++ protectedにアクセス不可
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
MFCアプリのコマンドラインでパ...
-
【ASP.NET】 独自で作成したク...
-
C#で通常のbuttonコントロール...
-
ダイアログクラスのコントロー...
-
派生クラスから基本クラスprote...
おすすめ情報