Builder模式又叫建造模式,是用于组装具有复杂结构的实例的模式。
示例程序是编写一个文档,并且写入到文件中,该文档具有以下结构,含有标题,字符串,一些条目。
- Builder抽象类,为建造模式的核心
package site.wangxin520.gof.builder; /** * 建造者模式的核心——建造者 * 负责定义用于生成实例的API接口 * @author wangXgnaw * 在本类中,定义了四个方法,分别是标题,字符串和条目,最后的close()方法则用于生成文件以及关闭相应的流 */ public abstract class Builder { /** * 抽象方法,传入字符串标题,用于生成文件的字符串 * @param title */ public abstract void makeTitle(String title); /** * 抽象方法,传入字符串 * @param string */ public abstract void makeString(String string); /** * 抽象方法,用于传入一个字符串数组,生成文件中对应的条目 * @param items */ public abstract void makeItems(String[] items); /** * 抽象方法,关闭相应的流 */ public abstract void close(); }
- Director 监工类,调用builder的方法
package site.wangxin520.gof.builder; /** * 管理者,监工 * 负责使用builder角色的接口来生成实例,它并不依赖于具体实现类,而是面对抽象类/父类,或者接口进行操作 * @author wangXgnaw * 在本类汇总有一个Builder的属性。 * 采用的是多态的方法,父类接口指向子类对象 */ public class Director { private Builder builder; /** * 构造器传入Builder属性的具体实现 * @param builder */ public Director(Builder builder){ this.builder=builder; } /** * 生成文档的方法 */ public void construct(){ builder.makeTitle("标题:大家好"); builder.makeString("从早上到下午"); builder.makeItems(new String[]{ "早安", "午安", }); builder.makeString("晚上"); builder.makeItems(new String[]{ "晚安", "拜拜", }); builder.close(); } }
- HtmlBuilder 继承了Builder类,实现了相应的方法
package site.wangxin520.gof.builder; import java.io.File; import java.io.FileWriter; import java.io.IOException; /** * 生成HTML文件的建造模式,对Builder抽象类的具体实现 * @author wangXgnaw * */ public class HtmlBuilder extends Builder{ private StringBuilder sb=new StringBuilder(); @Override public void makeTitle(String title) { sb.append("<html>").append("<head><title>").append(title).append("</title></head><body>"); } @Override public void makeString(String string) { sb.append("<p>").append(string).append("</p>"); } @Override public void makeItems(String[] items) { sb.append("<ul>"); for (String string : items) { sb.append("<li>").append(string).append("</li>"); } sb.append("</ul>"); } @Override public void close() { sb.append("</body></html>"); FileWriter fw=null; try { fw=new FileWriter(new File("E:/TextBuilder.html")); fw.write(sb.toString()); } catch (IOException e) { e.printStackTrace(); } finally { if(fw!=null){ try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
- TextBuilder同上
package site.wangxin520.gof.builder; import java.io.File; import java.io.FileWriter; import java.io.IOException; /** * 生成txt文件的建造模式,对Builder抽象类的具体实现 * * @author wangXgnaw * */ public class TextBuilder extends Builder { private StringBuilder sb = new StringBuilder(); @Override public void makeTitle(String title) { sb.append("========================================").append(" "); sb.append("【" + title + "】").append(" "); sb.append("========================================").append(" ").append(" "); } @Override public void makeString(String string) { sb.append("【.】" + string).append(" ").append(" "); } @Override public void makeItems(String[] items) { for (String string : items) { sb.append(" " + string).append(" "); } sb.append(" "); } @Override public void close() { sb.append("========================================"); FileWriter fw = null; try { fw = new FileWriter(new File("E:/TextBuilder.txt")); fw.write(sb.toString()); } catch (IOException e) { e.printStackTrace(); } finally { if (fw != null) { try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
- Main,测试类
package site.wangxin520.gof.builder; /** * 建造者模式的测试类 * @author wangXgnaw * */ public class Main { public static void main(String[] args) { //先构建一个Builder,采用的是TextBuilder的实现类 Builder b1=new TextBuilder(); //将Builder实例传入到Director中 Director director1=new Director(b1); //调用构造方法,生成文档 director1.construct(); //与上同 Builder b2=new HtmlBuilder(); Director director2=new Director(b2); director2.construct(); } }
- 测试结果:
没有报错,并且成功的在E盘中写入俩文件
TextBuilder.txt
TextBuilder.html(这里忘记改名字了)