21
Builder Pattern S. Yukita [email protected]

Builder Pattern

Embed Size (px)

DESCRIPTION

Builder Pattern. S. Yukita [email protected]. Builder パターン 使われ所. 大きなインスタンスを組み上げる場合。 インスタンスの組み上げにパターンがあるとき,パターンをディレクタに固定する。 組み上げパターンに従って実際の仕事をするのは Builder インタフェース(抽象クラス)を実装(具象化)するクラス。. uses. 例題のクラス図. Builder.java. public abstract class Builder { - PowerPoint PPT Presentation

Citation preview

Page 1: Builder Pattern

Builder Pattern

S. Yukita

[email protected]

Page 2: Builder Pattern

Builder Pattern 2

Builder パターン使われ所

• 大きなインスタンスを組み上げる場合。• インスタンスの組み上げにパターンがあるとき,パターンをディレクタに固定する。

• 組み上げパターンに従って実際の仕事をするのは Builderインタフェース(抽象クラス)を実装(具象化)するクラス。

Page 3: Builder Pattern

Builder Pattern 3

例題のクラス図

Main Director

builder

construct

Builder

makeTitle

makeString

makeItems

getResult

TextBuilder

makeTitle

makeString

makeItems

getResult

HTMLBuilder

makeTitle

makeString

makeItems

getResult

uses

Page 4: Builder Pattern

Builder Pattern 4

Builder.java

public abstract class Builder {

public abstract void makeTitle(String title);

public abstract void makeString(String str);

public abstract void makeItems(String[] items);

public abstract Object getResult();

}

Page 5: Builder Pattern

Builder Pattern 5

TextBuilder.java (1)

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");

}

Page 6: Builder Pattern

Builder Pattern 6

TextBuilder.java (2)

public void makeString(String str) {

buffer.append('■' + str + "\n");

buffer.append("\n");

}

Page 7: Builder Pattern

Builder Pattern 7

TextBuilder.java (3)

public void makeItems(String[] items) {

for (int i = 0; i < items.length; i++) {

buffer.append(" ・ " + items[i] + "\n");

}

buffer.append("\n");

}

Page 8: Builder Pattern

Builder Pattern 8

TextBuilder.java (4)

public Object getResult() {

buffer.append("==============================\n");

return buffer.toString();

}

}

Page 9: Builder Pattern

Builder Pattern 9

HTMLBuilder.java (1)

import java.io.*;

public class HTMLBuilder extends Builder {

private String filename;

private PrintWriter writer;

Page 10: Builder Pattern

Builder Pattern 10

HTMLBuilder.java (2) public void makeTitle(String title) {

filename = title + ".html";

try { writer =

new PrintWriter(new FileWriter(filename));

} catch (IOException e) {

e.printStackTrace();

}

writer.println( "<html><head><title>" + title

+ "</title></head><body>");

writer.println("<h1>" + title + "</h1>");

}

Page 11: Builder Pattern

Builder Pattern 11

HTMLBuilder.java (3) public void makeString(String str) {

writer.println("<p>" + str + "</p>");

}

public void makeItems(String[] items) {

writer.println("<ul>");

for (int i = 0; i < items.length; i++) {

writer.println("<li>" + items[i] + "</li>");

}

writer.println("</ul>");

}

Page 12: Builder Pattern

Builder Pattern 12

HTMLBuilder.java (4)

public Object getResult() {

writer.println("</body></html>");

writer.close();

return filename;

}

}

Page 13: Builder Pattern

Builder Pattern 13

Director.java (1)

public class Director {

private Builder builder;

public Director(Builder builder) {

this.builder = builder;

}

Page 14: Builder Pattern

Builder Pattern 14

Director.java (2) public Object construct() {

builder.makeTitle("Greeting");

builder.makeString("朝から昼にかけて ");

builder.makeItems(new String[]{

"おはようございます。 ", "こんにちは。 " });

builder.makeString("夜に ");

builder.makeItems(new String[]{

"こんばんは。 ", "おやすみなさい。 ", "さようなら。" });

return builder.getResult();

}

}

Page 15: Builder Pattern

Builder Pattern 15

Main.java (1)

public class Main {

public static void main(String[] args) {

if (args.length != 1) {

usage();

System.exit(0);

}

Page 16: Builder Pattern

Builder Pattern 16

Main.java (2) if (args[0].equals("plain")) {

Director director = new Director(

new TextBuilder());

String result = (String)director.construct();

System.out.println(result);

} else if (args[0].equals("html")) {

Director director = new Director(

new HTMLBuilder());

String filename = (String)director.construct();

System.out.println(filename + "が作成されました。 ");

} else { usage(); System.exit(0); }

}

Page 17: Builder Pattern

Builder Pattern 17

Main.java (3) public static void usage() {

System.out.println(

"Usage: java Main plain プレーンテキストで文書作成");

System.out.println(

"Usage: java Main html HTMLファイルで文書作成");

}

}

Page 18: Builder Pattern

Builder Pattern 18

実行結果 (plain)

java Main plain=================================[Greeting]■朝から昼にかけて ・おはようございます。 ・こんにちは。■夜に ・こんばんは。 ・おやすみなさい。 ・さようなら。=================================

Page 19: Builder Pattern

Builder Pattern 19

実行結果 (HTML)java Main htmlGreeting.html が作成されました。

<html><head><title>Greeting</title></head><body><h1>Greeting</h1><p> 朝から昼にかけて </p><ul><li> おはようございます。 </li><li> こんにちは。 </li></ul><p> 夜にかけて </p><ul><li> こんばんは。 </li><li> おやすみなさい。 </li><li> さようなら。 </li></ul></body></html>

Page 20: Builder Pattern

Builder Pattern 20

パターンClient Director

builder

construct

Builder

buildPart1

buildPart2

buildPart3

getResult

ConcreteBuilder

buildPart1

buildPart2

buildPart3

getResult

uses

Page 21: Builder Pattern

Builder Pattern 21

Sequence 図:Client :Director :ConcreteBuilder

constructbuildPart1