• 设计模式(七)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("======================
    ");
    11         buffer.append("
    ");
    12         buffer.append("[" + title + "]");
    13         buffer.append("
    ");
    14     }
    15 
    16     @Override
    17     public void makeString(String str) {
    18         buffer.append('*' + str + "
    ");
    19         buffer.append("
    ");
    20     }
    21 
    22     @Override
    23     public void makeItems(String[] items) {
    24         for (int i = 0; i < items.length; i++) {
    25             buffer.append("  ." + items[i] + "
    ");
    26         }
    27         buffer.append("
    ");
    28     }
    29 
    30     @Override
    31     public void close() {
    32         buffer.append("======================
    ");
    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模式从而得出结果。

    儿女情长什么的,最影响我们闯荡江湖了。
  • 相关阅读:
    Eclipse创建Maven Web项目 + 测试覆盖率 + 常见问题(2015.07.14——湛耀)
    JAVA面试题——JAVA编程题1(2015.07.22)
    Spring 国际化
    BeanPostProcessor 的使用,实现在对象初始化之前或者之后对对象进行操作
    spring 的配置 bean>>property>>name属性
    文件保存
    Spring-demo1(初学者的尝试,2015.03.19)
    新花生壳内网版2.3 + Tomcat7 搭建自己的网站(2015.01.21)
    (原)Struts 相关资源下载
    Xilinx 7 series FPGA multiboot技术的使用(转)
  • 原文地址:https://www.cnblogs.com/BigJunOba/p/8684252.html
Copyright © 2020-2023  润新知