デザインパターンとは、システム設計におけるクラスやインターフェースの関係に名前をつけたものです。GoFの23のパターンが有名です。
デザインパターンというのは、どんなパターンなのか、パターンの目的は何かということを覚えることが非常に重要なのですが、これを実際に適用しようとした場合に、いつ適用していいかが見えてこないとお話になりません。
そこで、自分の勉強も兼ねつつ、パターンの実践時における使用場所や、パターンを適用するきっかけを見つけられるようにメモしておきます。
今回は、インスタンスを生成する責務を切り出した、Factory Methodパターンです。
Factory Methodパターン
Factory Methodパターンは、生成するインスタンスの種類が多くなりそうな場合に、 インスタンス生成の責務を外に切り出して、保守性を高めるパターンです。
例えば、ショッピングサイトシステムを作っているとしましょう。このショッピングサイトでは、現在では5種類の商品しか販売していないのですが、この先商品の種類が増える可能性があります。しかし、どのような種類の商品が増えるかはわかりません。
この、将来的に種類が増えるかもしれないが、今はまだわからないといった状況でよく使われれるパターンです。
Factory Methodパターンを使うと、インスタンスの生成処理で既存のプログラムを修正することなく、新しい種類(例えば本とか、コンピュータといったカテゴリのこと)を追加することができます。
- 開放・閉鎖原則
- ただし、インスタンス生成のプログラムは、新規に作る必要があります。既存のコードを修正せずに、新しいコードで修正を行えるように設計することを、開放・閉鎖原則(Open・Closed Principle)といいます。
パターンの適用タイミング
このパターンは、主に、インスタンスの種類が将来的に増えそうな場合に使われます。
もうひとつは、コンストラクタではない場所でインスタンスの生成を行いたい場合(遅延ロード)に使えます。コンストラクタを直接呼ばせたくはないが、インスタンスは作成したい時がこの例です。
他には、ポリモーフィズムを使いたいのだが、インスタンスの生成は共通化したい場合に使います。
/* Staffというスーパークラスがあり、AccountantクラスとSalesmanクラスと、
* Developerクラスがあるとする。*/
Staff staff = new Accountant();
staff.calculateSalary();
staff = new Salesman();
staff.calculateSalary();
staff = new Developer();
staff.calculateSalary();
上記の例は、Staffスーパークラスで、実際のサブクラスを受けて、ポリモーフィズムを使って、自分の給料を計算させるプログラムだと考えてください。ここでは、それぞれインスタンスをサブクラス名を使って生成しています。
これを、Factory Methodを使って書き換えると
/* Staffというスーパークラスがあり、AccountantクラスとSalesmanクラスと、
* Developerクラスがあるとする。*/
Staff staff = StaffFactory.createStaff(args[0]);
staff.calculateSalary();
というように、サブクラスのインスタンス生成部を隠蔽することができます。
Factory Methodパターンには、もうひとつ重要な役割がありました。あるオブジェクトに関連するオブジェクトを、自身で作成させるというものです。
例えば、部品Aというオブジェクトは、ねじAというオブジェクトを必要とし、部品Bというオブジェクトは、ねじBというオブジェクトを必要とするとします。Factory Methodパターンを使うと、ねじA・ねじBを作成する責務を持つのは、それぞれ部品A、部品Bということになります。
ねじ partA = 部品A.createPart(); ねじ partB = 部品B.createPart();
Factory Methodパターンは
- インスタンスの種類が将来増えそうな場合
- コンストラクタではない場所でインスタンスを生成したい場合
- サブクラスを指定せずにインスタンスを生成したい場合
- 対となるオブジェクトを関連するオブジェクトに生成させたい場合
に使えるパターンだと言えます。
実装サンプルと参考文献
Factory Methodパターンの実装方法をもっと詳しく知りたい場合は、下記のサイトにアクセスするのをお勧めします。もしくは、参考書籍を載せておきますので、そちらをお買い求めください。(^^;)
- TECHSCORE(Factory Methodパターン)
- Open/Closed Principleについての解説
Open-Closed Principle とデザインパターン
- デザインパターンのお勧め書籍
- 独習シリーズのデザインパターン編。デザインパターンを一人でも学べます。
- Sun Microsystemのお墨付き。GoF以外のパターンも学べます。
- UMLを使って、オブジェクト指向のいいとこ取りができます。
- デザインパターンだけではなく、ソフトウェア設計の原則やプラクティスまで学びたい人におすすめ