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();@Overridepublic void makeTitle(String title) {sb.append("<html>").append("<head><title>").append(title).append("</title></head><body>");}@Overridepublic void makeString(String string) {sb.append("<p>").append(string).append("</p>");}@Overridepublic void makeItems(String[] items) {sb.append("<ul>");for (String string : items) {sb.append("<li>").append(string).append("</li>");}sb.append("</ul>");}@Overridepublic 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();@Overridepublic void makeTitle(String title) {sb.append("========================================").append("\r\n");sb.append("【" + title + "】").append("\r\n");sb.append("========================================").append("\r\n").append("\r\n");}@Overridepublic void makeString(String string) {sb.append("【.】" + string).append("\r\n").append("\r\n");}@Overridepublic void makeItems(String[] items) {for (String string : items) {sb.append("\t" + string).append("\r\n");}sb.append("\r\n");}@Overridepublic 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(这里忘记改名字了)