图解设计模式-Builder模式

用于组装具有复杂结构的实例叫做Builder模式。
抽象类Builder中定义了组装需要用的所用方法。
抽象类的每种具体实现(TextBuilder于HTMLBuilder)中定义了各自的组装时需要的个性化方法。
Director组装类中定义了组装的顺序。
 
角色:
Builder建造者:负责定义用于生成实例的接口API。Builder角色中准备了用于生成实例的方法。示例中由Builder类扮演。
ConcreteBuilder具体的建造者:负责实现Builder角色的接口类,这里定义了在生成实例时实际被调用的方法。有TextBuilder于HTMLBuilder类扮演。
Director监工:使用Builder具体类中声明的方法来编写文档。它不依赖与具体的类,,为了确保不论ConcreteBuilder角色如何定义,Director角色都能正常工作,它只调用在Builder抽象类中定义的方法。
Client使用者:使用Builder模式,Main方法。
优点:
针对抽象类编写,不针对具体类编程,解耦。
组装的具体实现被隐藏在Director类中。
Director类中定义了具体的construct方法,使用了Template Method模式。
 
代码:
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();
}
public class Director {
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
    //规定了组装的顺序
    public void construct() {
        builder.makeTitle("标题");
        builder.makeString("内容内容内容内容1");
        builder.makeItems(new String[] {"条目1","条目2"});
        builder.makeString("内容内容内容内容2");
        builder.makeItems(new String[] {"条目3","条目4"});
        builder.close();
    }
}


//构建text时,每个方法(组件)需要实现内容
public class TextBuilder extends Builder {
    private StringBuilder stringBuilder = new StringBuilder();
    //定义了各自的组装时需要的个性化方法
    @Override
    public void makeTitle(String title) {
        stringBuilder.append(title);
        stringBuilder.append("\n");
    }

    @Override
    public void makeString(String str) {
        stringBuilder.append(str);
        stringBuilder.append("\n");
    }

    @Override
    public void makeItems(String[] items) {
        for(int i=0;i<items.length;i++) {
            stringBuilder.append(items[i]);
        }
        stringBuilder.append("\n");
    }

    @Override
    public void close() {
        stringBuilder.append("==========================");
        stringBuilder.append("\n");
    }

    public String getResult() {
        return  stringBuilder.toString();
    }
}
//构建Html时,每个方法(组件)需要实现内容
public class HtmlBuilder extends Builder{
    private String filename;
    private PrintWriter printWriter;
    //定义了各自的组装时需要的个性化方法
    @Override
    public void makeTitle(String title) {
        filename = title + ".html";
        try {
            printWriter = new PrintWriter(new FileWriter("d:\\"+filename));
            printWriter.println(title);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void makeString(String str) {
        printWriter.println(str);
    }

    @Override
    public void makeItems(String[] items) {
        for(int i=0;i<items.length;i++) {
            printWriter.print(items[i]);
        }
        printWriter.println("");
    }

    @Override
    public void close() {
        printWriter.println("==========================");
        printWriter.close();
    }

    public String getResult() {
        return  filename;
    }
}
public class Main {

    public static void main(String[] args) {
        //构建text
        TextBuilder textBuilder = new TextBuilder();
        Director director = new Director(textBuilder);
        //进行构建
        director.construct();
        String result = textBuilder.getResult();
        System.out.println(result);

        //构建Html
        HtmlBuilder htmlBuilder = new HtmlBuilder();
        director = new Director(htmlBuilder);
        //进行构建
        director.construct();
        String resultHtml = htmlBuilder.getResult();
        System.out.println(resultHtml);
    }
}

猜你喜欢

转载自www.cnblogs.com/use-D/p/9581453.html