FactoryMethodパターンと同様に
「Template Method パターン」をインスタンス生成に適用させたパターンです。
FactoryMethodパターンが、「ある抽象的な型の実装を返す」というインターフェースを定義し、そのインターフェースの実装を多種揃えるといった形をとるのに対し
Builderパターンは、「多くの構成要素からなるオブジェクトを組み立てるための部品を返す」インターフェースを定義し、この実装を多種揃える形をとります。
Builderパターン クラス図 |
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 件のコメント:
コメントを投稿