Presentation is loading. Please wait.

Presentation is loading. Please wait.

Builder と Abstract Factory S. Yukita

Similar presentations


Presentation on theme: "Builder と Abstract Factory S. Yukita"— Presentation transcript:

1 Builder と Abstract Factory S. Yukita yukita@k.hosei.ac.jp

2 デザインパターン 第4回 2 1. Builder パターン 使われ所 大きなインスタンスを組み上げる場合。 インスタンスの組み上げにパターンが あるとき,パターンをディレクタに固 定する。 組み上げパターンに従って実際の仕事 をするのは Builder インタフェース(抽 象クラス)を実装(具象化)するクラ ス。

3 デザインパターン 第4回 3 例題のクラス図例題のクラス図 Main Director builder construct Builder makeTitle makeString makeItems getResult TextBuilder makeTitle makeString makeItems getResult HTMLBuilder makeTitle makeString makeItems getResult uses

4 デザインパターン 第4回 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(); }

5 デザインパターン 第4回 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"); }

6 デザインパターン 第4回 6 TextBuilder.java (2) public void makeString(String str) { buffer.append(' ■ ' + str + "\n"); buffer.append("\n"); }

7 デザインパターン 第4回 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"); }

8 デザインパターン 第4回 8 TextBuilder.java (4) public Object getResult() { buffer.append("==============================\n"); return buffer.toString(); }

9 デザインパターン 第4回 9 HTMLBuilder.java (1) import java.io.*; public class HTMLBuilder extends Builder { private String filename; private PrintWriter writer;

10 デザインパターン 第4回 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( " " + title + " "); writer.println(" " + title + " "); }

11 デザインパターン 第4回 11 HTMLBuilder.java (3) public void makeString(String str) { writer.println(" " + str + " "); } public void makeItems(String[] items) { writer.println(" "); for (int i = 0; i < items.length; i++) { writer.println(" " + items[i] + " "); } writer.println(" "); }

12 デザインパターン 第4回 12 HTMLBuilder.java (4) public Object getResult() { writer.println(" "); writer.close(); return filename; }

13 デザインパターン 第4回 13 Director.java (1) public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; }

14 デザインパターン 第4回 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(); }

15 デザインパターン 第4回 15 Main.java (1) public class Main { public static void main(String[] args) { if (args.length != 1) { usage(); System.exit(0); }

16 デザインパターン 第4回 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); } }

17 デザインパターン 第4回 17 Main.java (3) public static void usage() { System.out.println( "Usage: java Main plain プレーンテキストで文書作成 "); System.out.println( "Usage: java Main html HTML ファイルで文書作成 "); }

18 デザインパターン 第4回 18 実行結果 (plain) java Main plain ================================= [Greeting] ■ 朝から昼にかけて ・おはようございます。 ・こんにちは。 ■ 夜に ・こんばんは。 ・おやすみなさい。 ・さようなら。 =================================

19 デザインパターン 第4回 19 実行結果 (HTML) java Main html Greeting.html が作成されました。 Greeting 朝から昼にかけて おはようございます。 こんにちは。 夜にかけて こんばんは。 おやすみなさい。 さようなら。

20 デザインパターン 第4回 20 パターン Client Director builder construct Builder buildPart1 buildPart2 buildPart3 getResult ConcreteBuilder buildPart1 buildPart2 buildPart3 getResult uses

21 デザインパターン 第4回 21 Sequence 図 :Client:Director:ConcreteBuilder construct buildPart1

22 デザインパターン 第4回 22 2. Abstract Factory パターン 類似のパターンとの比較 Builder パターンでは Builder の抽象メソッド を Director が次々呼び出すことによって大き なインスタンスを部分を徐々に構築する。 Abstract Factory パターンは,インスタンス群 の生成とそれらのネットワーク配線に力点を おく。インスタンス生成方法および配線方法 を抽象化する。 Factory Method パターンはインスタンス生成 を環境との配線とともに行う定石を抽象化し ている。

23 デザインパターン 第4回 23 Item caption makeHTML Link url makeHTML Tray tray add makeHTML Page title author content add output makeHTML Factory getFactory createLink createTray createPage creates

24 デザインパターン 第4回 24 ListLink makeHTML ListTray makeHTML ListPage makeHTML ListFactory createLink createTray createPage creates

25 デザインパターン 第4回 25 Item.java package factory; public abstract class Item { protected String caption; public Item(String caption) { this.caption = caption; } public abstract String makeHTML(); }

26 デザインパターン 第4回 26 Link.java package factory; public abstract class Link extends Item { protected String url; public Link(String caption, String url) { super(caption); this.url = url; }

27 デザインパターン 第4回 27 Tray.java package factory; import java.util.Vector; public abstract class Tray extends Item { protected Vector tray = new Vector(); public Tray(String caption) { super(caption); } public void add(Item item) { tray.add(item); }

28 デザインパターン 第4回 28 Page.java(1) package factory; import java.io.*; import java.util.Vector; public abstract class Page { protected String title; protected String author; protected Vector content = new Vector();

29 デザインパターン 第4回 29 Page.java(2) public Page(String title, String author) { this.title = title; this.author = author; } public void add(Item item) { content.add(item); }

30 デザインパターン 第4回 30 Page.java(3) public void output() { try { String filename = title + ".html"; Writer writer = new FileWriter(filename); writer.write(this.makeHTML()); writer.close(); System.out.println(filename + " を作成しました。 "); } catch (IOException e) {e.printStackTrace();} }

31 デザインパターン 第4回 31 Page.java(4) public abstract String makeHTML(); }

32 デザインパターン 第4回 32 Factory.java(1) package factory; public abstract class Factory { public static Factory getFactory(String classname) { Factory factory = null; try { factory = (Factory)Class.forName(classname).newInstance(); } catch (ClassNotFoundException e) { System.err.println(" クラス " + classname + " が見つかりません。 "); } catch (Exception e) {e.printStackTrace();} return factory; }

33 デザインパターン 第4回 33 Factory.java(2) public abstract Link createLink(String caption, String url); public abstract Tray createTray(String caption); public abstract Page createPage(String title, String author); }

34 デザインパターン 第4回 34 ListLink.java package listfactory; import factory.*; public class ListLink extends Link { public ListLink(String caption, String url) { super(caption, url); } public String makeHTML() { return " " + caption + " \n"; }

35 デザインパターン 第4回 35 ListTray.java(1) package listfactory; import factory.*; import java.util.Iterator; public class ListTray extends Tray { public ListTray(String caption) { super(caption); }

36 デザインパターン 第4回 36 ListTray.java(2) public String makeHTML() { StringBuffer buffer = new StringBuffer(); buffer.append(" \n"); buffer.append(caption + "\n"); buffer.append(" \n"); Iterator it = tray.iterator(); while (it.hasNext()) { Item item = (Item)it.next(); buffer.append(item.makeHTML()); } buffer.append(" \n"); buffer.append(" \n"); return buffer.toString(); }

37 デザインパターン 第4回 37 ListPage.java(1) package listfactory; import factory.*; import java.util.Iterator; public class ListPage extends Page { public ListPage(String title, String author) { super(title, author); }

38 デザインパターン 第4回 38 ListPage.java(2) public String makeHTML() { StringBuffer buffer = new StringBuffer(); buffer.append(" " + title + " \n"); buffer.append(" \n"); buffer.append(" " + title + " \n"); buffer.append(" \n");

39 デザインパターン 第4回 39 ListPage.java(3) Iterator it = content.iterator(); while (it.hasNext()) { Item item = (Item)it.next(); buffer.append(item.makeHTML()); }

40 デザインパターン 第4回 40 ListPage.java(4) buffer.append(" \n"); buffer.append(" " + author + " "); buffer.append(" \n"); return buffer.toString(); }

41 デザインパターン 第4回 41 ListFactory.java(1) package listfactory; import factory.*; public class ListFactory extends Factory { public Link createLink(String caption, String url){ return new ListLink(caption, url); }

42 デザインパターン 第4回 42 ListFactory.java(2) public Tray createTray(String caption) { return new ListTray(caption); } public Page createPage(String title, String author) { return new ListPage(title, author); }

43 デザインパターン 第4回 43 Main.java(1) import factory.*; public class Main { public static void main(String[] args) { if (args.length != 1) { System.out.println("Usage: java Main class.name.of.ConcreteFactory"); System.out.println("Example 1: java Main listfactory.ListFactory"); System.out.println("Example 2: java Main tablefactory.TableFactory"); System.exit(0); }

44 デザインパターン 第4回 44 Main.java(2) Factory factory =Factory.getFactory(args[0]); Link asahi = factory.createLink( “ 朝日新聞 ”, "http://www.asahi.com/"); Link yomiuri = factory.createLink( “ 読売新聞 ”, "http://www.yomiuri.co.jp/");

45 デザインパターン 第4回 45 Main.java(3) Link us_yahoo = factory.createLink("Yahoo!", "http://www.yahoo.com/"); Link jp_yahoo =factory.createLink("Yahoo!Japan", "http://www.yahoo.co.jp/"); Link excite = factory.createLink("Excite", "http://www.excite.com/"); Link google = factory.createLink("Google", "http://www.google.com/");

46 デザインパターン 第4回 46 Main.java(4) Tray traynews = factory.createTray(" 新聞 "); traynews.add(asahi); traynews.add(yomiuri); Tray trayyahoo= factory.createTray("Yahoo!"); trayyahoo.add(us_yahoo); trayyahoo.add(jp_yahoo);

47 デザインパターン 第4回 47 Main.java(5) Tray traysearch = factory.createTray(" サーチエンジン "); traysearch.add(trayyahoo); traysearch.add(excite); traysearch.add(google);

48 デザインパターン 第4回 48 Main.java(6) Page page = factory.createPage("LinkPage", " 結城 浩 "); page.add(traynews); page.add(traysearch); page.output(); }

49 デザインパターン 第4回 49 実行方法 java Main listFactory.ListFactory

50 デザインパターン 第4回 50 生成された HTML をブラウザでみる と LinkPage 新聞 朝日新聞 読売新聞 サーチエンジン Yahoo! Yahoo!Japan Excite Google

51 デザインパターン 第4回 51 パターン AbstractProduct1 excecuteA excecuteB AbstractFactory createProduct1 createProduct2...... ConcreteProduct1 excecuteA excecuteB AbstractFactory createProduct1 createProduct2...... creates

52 デザインパターン 第4回 52 たとえ話 AbstractProduct1 excecuteA excecuteB AbstractFactory createProduct1 createProduct2...... ConcreteProduct1 excecuteA excecuteB ConcreteFactory createProduct1 createProduct2...... creates 役 役者 Main 演出家


Download ppt "Builder と Abstract Factory S. Yukita"

Similar presentations


Ads by Google