Builder模式,从这个名字我们可以看出来,这种设计模式就是用于组装具有复杂结构的实例的。
下面还是以一个实例程序来解释这种设计模式,先看实例程序的类图。
这里为了调试方便,只实现其中一个功能TextBuilder,剩下的HTMLBuilder可自行编写。
然后是实例程序代码。
1 package BigJunOba.bjtu.Builder; 2 3 public abstract class Builder { 4 5 public abstract void makeTitle(String title); //编写标题 6 public abstract void makeString(String str); //编写字符串 7 public abstract void makeItems(String[] items); //编写含有条目 8 public abstract void close(); //完成文档 9 10 }
这是Builder类。
1 package BigJunOba.bjtu.Builder; 2 /** 3 * @author BigJunOba 4 * Director类使用Builder类中声明的方法来编写文档 5 */ 6 public class Director { 7 8 private Builder builder; 9 10 public Director(Builder builder) { 11 this.builder = builder; 12 } 13 14 public void construct() { 15 builder.makeTitle("我是一个标题"); 16 builder.makeString("一.下面我要讲第一个问题"); 17 builder.makeItems(new String[] { 18 "1.廉", 19 "2.宝", 20 "3.宝", 21 }); 22 builder.makeString("二.下面我还要讲第二个问题"); 23 builder.makeItems(new String[] { 24 "4.大", 25 "5.帅", 26 "6.逼", 27 }); 28 builder.close(); 29 } 30 31 }
这是Director类。
1 package BigJunOba.bjtu.Builder; 2 3 public class TextBuilder extends Builder { 4 5 //用来将文档内容保存在buffer字段中 6 private StringBuffer buffer = new StringBuffer(); 7 8 @Override 9 public void makeTitle(String title) { 10 buffer.append("======================\n"); 11 buffer.append("\n"); 12 buffer.append("[" + title + "]"); 13 buffer.append("\n"); 14 } 15 16 @Override 17 public void makeString(String str) { 18 buffer.append(‘*‘ + str + "\n"); 19 buffer.append("\n"); 20 } 21 22 @Override 23 public void makeItems(String[] items) { 24 for (int i = 0; i < items.length; i++) { 25 buffer.append(" ." + items[i] + "\n"); 26 } 27 buffer.append("\n"); 28 } 29 30 @Override 31 public void close() { 32 buffer.append("======================\n"); 33 } 34 35 public String getResult() { 36 return buffer.toString(); //将StringBuffer变换为String 37 } 38 }
这是TextBuilder类。
1 package BigJunOba.bjtu.Builder; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 TextBuilder textBuilder = new TextBuilder(); 8 Director director = new Director(textBuilder); 9 director.construct(); 10 String result = textBuilder.getResult(); 11 System.out.println(result); 12 13 } 14 }
这是Main类。
====================== [我是一个标题] *一.下面我要讲第一个问题 .1.廉 .2.宝 .3.宝 *二.下面我还要讲第二个问题 .4.大 .5.帅 .6.逼 ======================
这是输出。
Builder模式的类图和时序图如下。
解释每一个部分:
Builder:
Director
ConcreteBuilder
Client