2012年12月4日火曜日

Builder パターン(ビルダー・パターン)

Builder パターンは、生成に関するパターンのひとつです。

FactoryMethodパターンと同様に
Template Method パターン」をインスタンス生成に適用させたパターンです。

FactoryMethodパターンが、「ある抽象的な型の実装を返す」というインターフェースを定義し、そのインターフェースの実装を多種揃えるといった形をとるのに対し
Builderパターンは、「多くの構成要素からなるオブジェクトを組み立てるための部品を返す」インターフェースを定義し、この実装を多種揃える形をとります。

Builderパターン クラス図
Builderパターン クラス図
Director・・・・Builderクラスをコンポジットし目的となるProductオブジェクトを生成するクラス
Builder・・・・Productオブジェクトの生成プロセスを抽象化したクラス
ConcreteBuilder・・・Builderクラスの実装と、Productオブジェクトを取り出すメソッドを持つ。
Product・・・・・複合オブジェクト。

Directorクラス

ファイル名:Director.java

public class Director {
    private Builder builder;
    public Director(Builder builder) { // Builderのサブクラスのインスタンスが渡ってくる
        this.builder = builder;             // builderフィールドに保持しておく。
    }

   // 生成プロセスを記述。(ある意味、Facedeです。)
    public void construct() {             // 文書構築
        builder.makeTitle("Greeting");              // タイトル
        builder.makeString("朝から昼にかけて");     // 文字列
        builder.makeItems(new String[]{             // 箇条書き
            "おはようございます。",
            "こんにちは。",
        });
        builder.makeString("夜に");                 // 別の文字列
        builder.makeItems(new String[]{             // 別の箇条書き
            "こんばんは。",
            "おやすみなさい。",
            "さようなら。",
        });
        builder.close();                 // 文書を完成させる
    }
}
-----------------------------------------------------------
Builderクラス。

ファイル名:Builder

public abstract class Builder {
    public abstract void makeTitle(String title);
    public abstract void makeString(String str);
    public abstract void makeItems(String[] items);
    public abstract void close();
}
-----------------------------------------------------------
ConcreteBuilderにあたるクラス①。

ファイル名:TextBuilder.java

public class TextBuilder extends Builder {
    private StringBuffer buffer = new StringBuffer();           // このフィールドに文書を構築していく
    public void makeTitle(String title) {                       // プレーンテキストでのタイトル
        buffer.append("==============================\n");          // 飾り線
        buffer.append("『" + title + "』\n");                       // 『』つきのタイトル
        buffer.append("\n");                                        // 空行
    }
    public void makeString(String str) {                        // プレーンテキストでの文字列
        buffer.append('■' + str + "\n");                           // ■つきの文字列
        buffer.append("\n");                                        // 空行
    }
    public void makeItems(String[] items) {                     // プレーンテキストでの箇条書き
        for (int i = 0; i < items.length; i++) {
            buffer.append(" ・" + items[i] + "\n");                // ・つきの項目
        }
        buffer.append("\n");                                        // 空行
    }
    public void close() {                                       // 文書の完成
        buffer.append("==============================\n");          // 飾り線
    }
    public String getResult() {                                 // 完成した文書
        return buffer.toString();                                   // StringBufferをStringに変換
    }
}
------------------------------------------------------------
ConcreteBuilderにあたるクラス②。

ファイル名:HTMLBuilder.java

import java.io.*;
public class HTMLBuilder extends Builder {
    private String filename;                                    // 作成するファイル名
    private PrintWriter writer;                                 // ファイルに書き込むPrintWriter
    public void makeTitle(String title) {                       // HTMLファイルでのタイトル
        filename = title + ".html";                                 // タイトルを元にファイル名決定
        try {
            writer = new PrintWriter(new FileWriter(filename));     // PrintWriterを作る
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.println("<html><head><title>" + title + "</title></head><body>");    // タイトルを出力
        writer.println("<h1>" + title + "</h1>");
    }
    public void makeString(String str) {                        // HTMLファイルでの文字列
        writer.println("<p>" + str + "</p>");                       // <p>タグで出力
    }
    public void makeItems(String[] items) {                     // HTMLファイルでの箇条書き
        writer.println("<ul>");                                     // <ul>と<li>で出力
        for (int i = 0; i < items.length; i++) {
            writer.println("<li>" + items[i] + "</li>");
        }
        writer.println("</ul>");
    }
    public void close() {                                       // 文書の完成
        writer.println("</body></html>");                           // タグを閉じる
        writer.close();                                             // ファイルをクローズ
    }
    public String getResult() {                                 // 完成した文書
        return filename;                                            // ファイル名を返す
    }
}
----------------------------------------------------
Mainクラス。

ファイル名:Main.java

public class Main {
    public static void main(String[] args) {
        if (args.length != 1) {
            usage();
            System.exit(0);
        }

// 起動パラメータにより、ConcreteBuilderのインスタンスを切り替える。
        if (args[0].equals("plain")) {

             // TextBuilderのインスタンスを生成して使用
            TextBuilder textbuilder = new TextBuilder();
            Director director = new Director(textbuilder);
            director.construct();
            String result = textbuilder.getResult();
            System.out.println(result);
        } else if (args[0].equals("html")) {

             // HTMLBuilderのインスタンスを生成して使用
            HTMLBuilder htmlbuilder = new HTMLBuilder();
            Director director = new Director(htmlbuilder);
            director.construct();
            String filename = htmlbuilder.getResult();
            System.out.println(filename + "が作成されました。");
        } else {
            usage();
            System.exit(0);
        }
    }
    public static void usage() {    
    System.out.println("Usage: java Main plain      プレーンテキストで文書作成");
        System.out.println("Usage: java Main html       HTMLファイルで文書作成");
    }
}

0 件のコメント:

コメントを投稿









ロリポップ!なら月々105円から

WordPress、MovableTypeなどの簡単インストール、

アクセス解析、ウェブメーラーが標準装備!






プロペシア