Builder模式(建造者模式)

Builder模式:組裝具有複雜結構的實例,組裝的具體過程封裝Director角色中。

實例:。含有一個標題

          。含有幾個字符串

          。含有條目項目

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

}

Director類:(Director)

public class Director {
    private Builder builder;
    public Director(Builder builder) {              // 因爲接收的參數是Builder類的子類
        this.builder = builder;                     // 所以可以將其保存在builder字段中
    }
    public void construct() {                       // 編寫文檔
        builder.makeTitle("Greeting");              // 標題
        builder.makeString("從早上至下午");         // 字符串
        builder.makeItems(new String[]{             // 條目
            "早上好。",
            "下午好。",
        });
        builder.makeString("晚上");                 // 其他字符串
        builder.makeItems(new String[]{             // 其他條目
            "晚上好。",
            "晚安。",
            "再見。",
        });
        builder.close();                            // 完成文檔
    }

}

TextBuilder類:(ConcreteBuilder具體建造者)

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
    }

}

HTMLBuilder類:(ConcreteBuilder具體建造者)

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類:

public class Main {
    public static void main(String[] args) {
        if (args.length != 1) {
            usage();
            System.exit(0);
        }
        if (args[0].equals("plain")) {
            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 = 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文檔");
    }

}

Builder(建造者)負責定義用於生成實例的接口
ConcreteBuilder(具體的建造者)生成實例時 實際被調用的方法
Director(監工)使用Builder接口(API)來生成實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章