2016年9月4日日曜日

Simple Factoryパターン

システム開発を行う上での問題はいかに結合度を低くするかにあるでしょう。

デザインパターンでは様々な生成に関するパターンが作られてきました。

そこで今回はSimple Factoryパターンを見ていきましょう。

このパターンは、与えられたデータに基づいて、

複数の可能なクラスの中の1つのクラスのインスンスを返します。

Simple Factoryを理解するために、まずはソースを見て下さい。

// 基底クラス
abstract class X {       abstract public void do_X();}
// サブクラス
public class XY extends X {
         public void do_X() {
                  int i = 5;
         }
}
// サブクラス
public class XZ extends X {
          public void do_X {
                   int i = 6;
          }
}
// 引数で渡される値に基づいて、どちらかのサブクラスのインスタンスを返します。
public class XFactory {
          public X getClass(int index) {
                  if ( index == 1) {
                       return new XY();
                  } else {
                       return new XZ();
                  }
          }
}
// テストクラス
public class TEST {
            public static void main(String args[]) {
                    int index = 1;
                    XFactory factory = new XFactory();
                    X x = factory.getClass(index);
                    x.do_X();
            }
}
このソースは、Xは基底クラスで、XYとXZはXのサブクラスになっています。

クラスXFactoryは、引数で渡される値に基づいて、

これらのサブクラスのどちらのインスタンスを返すべきか判断します。

ここでは、メソッドgetClass()がそうです。このメソッドは何らかの値を引数で受け取り、

その値に基づいてクラスXの何らかの(XYもしくはXZの)インスタンスを返すのです。

クラスXYならびにXZは同じ(実装内容が異なりますが)メソッドdo_X()を持っているため、

どちらのクラスのインスタンスを返すべきかは、完全にFactoryクラス(ここではXFactory)

に任されるのです。

以上がSimple Factoryパターンの基本原理です。

どのクラスのインスタンスを返すべきかを判断して返す「抽象」を作るわけです。

返されたインスタンスに対しては、それが実際にどのサブクラスに属するかを意識することなく

メソッドを呼び出せます。個々のクラスの具体的はメソッドに依存することがなくなります。

DIコンテナ全盛の中で生成に関するパターンを学ぶ必要があるのかと言われたりもしますが、

プログラムの結合度を減らすために何故その技術が出来たのかの経緯を知るためには

必要であると感じました。


人気ブログランキングへ


0 件のコメント:

コメントを投稿