用于组装具有复杂结构的实例叫做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
//构建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
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); }}