设计模式(七)Builder模式
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类。这里需要注意的是,Director构造器的参数是Builder类型的,但我们知道,Builder类是抽象类,是无法实例化的,所以在这里实际上传递给Director类的是Builder类的子类。然后construct方法就是编写文档的方法,调用这个方法后就会编写文档。
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类是Builder类的子类,实现了使用纯文本编写文档并以string返回结果。
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类作为测试类,首先创建了一个TextBuilder的对象,然后把Builder类的子类,即TextBuilder的对象的实例传递给Director类,然后打印输出结果。
====================== [我是一个标题] *一.下面我要讲第一个问题 .1.廉 .2.宝 .3.宝 *二.下面我还要讲第二个问题 .4.大 .5.帅 .6.逼 ======================
这是输出。
Builder模式的类图和时序图如下。
解释每一个部分:
Builder:定义用于生成实例的接口。
Director:使用Builder中定义的接口,
ConcreteBuilder:用来具体实现Builder接口,在生成实例时实际被调用。这里要注意的是,可以有多个ConcreteBuilder来实现不同的功能。如示例中没有实现的HTMLBuilder类。
Client:使用了Builder模式,不属于模式的一部分,示例中的Main类就是使用Builder模式从而得出结果。
儿女情长什么的,最影响我们闯荡江湖了。