设计模式之——Builder建造模式

Posted 博客王大锤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之——Builder建造模式相关的知识,希望对你有一定的参考价值。

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();
    
    @Override
    public void makeTitle(String title) {
        sb.append("<html>").append("<head><title>").append(title).append("</title></head><body>");
    }

    @Override
    public void makeString(String string) {
        sb.append("<p>").append(string).append("</p>");
    }

    @Override
    public void makeItems(String[] items) {
        sb.append("<ul>");
        for (String string : items) {
            sb.append("<li>").append(string).append("</li>");
        }
        sb.append("</ul>");
    }

    @Override
    public 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();

    @Override
    public void makeTitle(String title) {
        sb.append("========================================").append("\\r\\n");
        sb.append("【" + title + "】").append("\\r\\n");
        sb.append("========================================").append("\\r\\n").append("\\r\\n");
    }

    @Override
    public void makeString(String string) {
        sb.append("【.】" + string).append("\\r\\n").append("\\r\\n");
    }

    @Override
    public void makeItems(String[] items) {
        for (String string : items) {
            sb.append("\\t" + string).append("\\r\\n");
        }
        sb.append("\\r\\n");
    }

    @Override
    public 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盘中写入俩文件

image

TextBuilder.txt

image

TextBuilder.html(这里忘记改名字了)

image

以上是关于设计模式之——Builder建造模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式:命令模式——命令模式扩展之日志请求

设计模式之——Decorator模式

设计模式之——Builder建造模式

设计模式之——浅谈strategy模式(策略模式)

设计模式:命令模式——命令模式扩展之宏命令

设计模式之——迭代器模式