LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

Templete Methodパターンに触れてみる

Posted at

今日の目標

JavaのTemplete Methodパターンとはどういったものなのかを知る

使うもの

ではスタート

はじめに

まずはTemplete MethodパターンとはどのようなものなのかをWikipediaさんで調べてみる。

Template Method パターン(テンプレート・メソッド・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。「振る舞いに関するパターン」に属する。Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せることである。そのため、システムのフレームワークを構築するための手段としてよく活用される。(WikidediaのTemplate Method パターン

形だけ流れを作っておいて、中で何をするかはテンプレートをextendsしたクラスにお任せする、ということらしい。今までのパターン(Iterator、Adapter)の中で一番わかりやすい気がする。

本のサンプルを参考にしてみる

このパターンを見た瞬間、「3匹の子豚か!!」とよくわからないインスピレーションを得たので、直感を利用して2匹(3匹目は勝手に省略)の子豚をソースコードにしてみた。

BuildTemplete.java
package kobuta;

public abstract class BuildTemplete {

    abstract void design();
    abstract void build();
    final void construction() {
        design();
        for(int i=0;i<5;i++) {
            build();
        }
        delivery();
    }
    abstract void delivery();
}
Kobuta1.java
package kobuta;

public class Kobuta1 extends BuildTemplete {

    private String material;

    public Kobuta1(String material) {
        this.material = material;
    }

    @Override
    void design() {
        System.out.println("パソコンを使って設計");
    }

    @Override
    void build() {
        System.out.println(material + "の発注");
        System.out.println(material + "を使う");
    }

    @Override
    void delivery() {
        System.out.println("依頼者に説明して納品");
    }

}
Kobuta2.java
package kobuta;

public class Kobuta2 extends BuildTemplete {

    private String material;

    public Kobuta2(String material) {
        this.material = material;
    }

    @Override
    void design() {
        System.out.println("紙で設計");
    }

    @Override
    void build() {
        System.out.println(material + "を使う");
    }

    @Override
    void delivery() {
        System.out.println("説明資料を渡して納品");
    }

}

BuildTempleteが今回のTempleteの役割を担っている。
BuildTempleteは、constructionというメソッドで流れの形だけ指定している。つまりは、「建設」を依頼されたら以下のことをする、という流れを作っているだけである。

  1. design(設計)を1回する
  2. build(建てる)を5回繰り返す
  3. delivery(納品)を1回する

その中で何をするか、はBuildTempleteをextendsした各子豚さんに任せている。
そしてそれらを使う側は、「建設してよ」というメッセージを送るだけで、内部で何をしているのかはわからなくても「建設」に必要なことは子豚さんたちが頑張ってやってくれる、という仕組み。

Main.java
package kobuta;

public class Main {

    public static void main(String[] args) {
        BuildTemplete bt1 = new Kobuta1("コンクリート");
        BuildTemplete bt2 = new Kobuta2("木材");

        System.out.println("***** Kobuta1の建設 *****");
        bt1.construction();
        System.out.println("***** Kobuta2の建設 *****");
        bt2.construction();
    }

}

結果。

***** Kobuta1の建設 *****
パソコンを使って設計
コンクリートの発注
コンクリートを使う
コンクリートの発注
コンクリートを使う
コンクリートの発注
コンクリートを使う
コンクリートの発注
コンクリートを使う
コンクリートの発注
コンクリートを使う
依頼者に説明して納品
***** Kobuta2の建設 *****
紙で設計
木材を使う
木材を使う
木材を使う
木材を使う
木材を使う
説明資料を渡して納品

子豚がわかりやすいかどうかはともかくとして、これはTemplete Methodとはお友達になれそうです。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up