Page List

Search on the blog

2012年12月31日月曜日

デザインパターン(8) Abstract Factory

まとめ
  • オブジェクト生成のためのデザインパターン。
  • クライアントはabstract factoryを通してオブジェクトの生成を行う。
  • クライアントは生成されたオブジェクトの具体的な実装は知らない。
  • abstract factoryを継承したconcrete factoryをシステム変数やプロパティファイル、実行引数などで指定することにより、使用される具体的な工場を変えることができる。
  • 具体的な工場の種類によって生成されるオブジェクト(concrete object)の具体的な実装は異なる。
  • 新しい種類のconcrete factory / concrete objectをクライアントへの影響なく追加できる。

疑問点
Factory Method Patternとの違いがよく分かっていないような気がする。

参考[2]によると、「Factory methodは単なるメソッド。Factory methodを実装しているクラスの本来の役割はオブジェクトの生成ではない。これに対して、Abstract Factoryはオブジェクト生成のためのクラス。異なる工場では異なる製品が作成される。」とある。

Factory MethodってAbstract Factoryと同じようなことをするイメージを持っていたけど、もっと単純なものという認識でいいのだろうか。。単純にそのクラスで使いたいオブジェクトを生成するときにnewせずにcreateInstanceみたいなメソッドを使うぞ!と決めたらそれがFactory Methodになるんだろうか・・。

 お、いい説明を見つけた。Factory methodのエッセンスは、
Define an interface for creating an object, but let the classes that implement the interface decide which class to instantiate. The Factory method lets a class defer instantiation to subclasses.」 (参考[3])

ふむふむ。なんか分かってきた。逆にAbstract Factoryのエッセンスは、
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.」 (参考[1])

やべっ。超分かりやすい。なんか分かったような気がする。

Factory methodの場合は、使いたいオブジェクトを生成するためのメソッドがスーパークラスで定義されているので、それを実装して具体的にどのクラスを使うか決めてください。オブジェクトを作りたいときは、newじゃなくてそのメソッド(Factory method)を使ってください。

Abstract Factoryの場合は、オブジェクトの使用者クラスは、newしてそのオブジェクトを生成するのではなく、コンストラクタで受け取った(またはグローバルにアクセスできる部分に存在する)factoryさんにオブジェクトの生成を委譲してください。ただしfactoryさんの具体的な実装については使用者は知る必要はありません。実行環境ごとにfactoryさんの具体的な実装は異なっており、生成されるオブジェクトの具体的な実装も異なりますが、使用者はこれを意識する必要はありません。

と、こういうことかな。間違っていたらご指摘いただけると嬉しいです。

参考URL
[1] http://en.wikipedia.org/wiki/Abstract_factory_pattern
[2] http://stackoverflow.com/questions/5739611/differences-between-abstract-factory-pattern-and-factory-method
[3] http://en.wikipedia.org/wiki/Factory_method_pattern

0 件のコメント:

コメントを投稿