[[デザインパターン]] > ファクトリ(Factory)
* ファクトリ(Factory) [#db650c2d]
#setlinebreak(on);

区分値などのデータ状態に応じて生成するインスタンスを切り替える必要がある場合などに、
切り替えの為の判断ロジックを Factory に任せてしまう事で、使用側から、インスタンス生成にかかる条件分岐などを排除する事ができる。

* ストラテジ(Strategy) [#db650c2d]
データの状態(区分値)などに応じてビジネスロジックを丸ごと入れ替える事ができる。
また、ファクトリと併用すれば、区分値の増減があった場合にも、メインのロジックに手を入れる必要がなくなるし、
ストラテジにスーパークラスを用意すれば共通部分の重複が大幅に排除できる。

** Factory、Strategy を使用しない場合 [#veefc482]
#html(<div  style="padding:0px 0px 0px 20px;">)
メインロジック
#mycode(){{
public class MyMainProc {
  public static void main(String[] args){


    if (hogeKbn == 1) {
      MyLogicA logicA = new MyLogicA();
      if (logicA.check()){
        logicA.update();
      }
    } else if (hogeKbn == 2) {
      MyLogicB logicB = new MyLogicB();
      if (logicB.check()){
        logicB.update();
      }
    }
  }
}
}}
#html(</div>)

** Factory、Strategy を使用した場合 [#n72e0765]
#html(<div  style="padding:0px 0px 0px 20px;">)
メインロジック
#mycode(){{
public class MyMainProc {
  public static void main(String[] args){


    MyLogicIf myLogic = MyFactory.create(hogeKbn);
    if (myLogic.check()){
      myLogic.update();
    }
  }
}
}}

Factory定義
#mycode(){{
public class MyFactory {
  public static MyLogicIf create(int kbn){
    if (kbn == 1) {
      return new MyLogicA();
    } else if (kbn == 2) {
      return new MyLogicB();
    }
  }
}
}}

Strategy の Interface定義
#mycode(){{
public Interface MyLogicIf {
  public abstract boolean check();
  public abstract void update();
}
}}

区分値1用の処理
#mycode(){{
public class MyLogicA implements MyLogicIf {
  public boolean check(){
    // 区分値1用のチェック処理を記述
  }
  public void update(){
    // 区分値1用の更新処理を記述
  }
}
}}

区分値2用の処理
#mycode(){{
public class MyLogicB implements MyLogicIf {
  public boolean check(){
    // 区分値2用のチェック処理を記述
  }
  public void update(){
    // 区分値2用の更新処理を記述
  }
}
}}

#html(</div>)


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS