设计模式(七)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模式从而得出结果。

 

 

posted @ 2018-04-01 11:03  BigJunOba  阅读(318)  评论(0编辑  收藏  举报