构建者模式-Builder(Java实现)

构建者模式-Builder

Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来.

本文中的例子: 一篇小文章包括标题title, 内容string, 和详情item. 

如果想要构建如下的一个文本:

==============================
『 Greeting 』

■ 从早上至下午

 ・早上好。
 ・下午好。

■ 晚上

 ・晚上好。
 ・晚安。
 ・再见。

==============================

 那么在建造者模式中, 只需要:

1. 设定标题为Greeting

2. 一段主要内容为"从早上至下午" 的文本

3. 然后加上两条详情"早上好" "下午好".

4. 再加一段内容为"晚上"的文本 

5. 然后再加上三条详情"晚上好" "晚安" "再见"

就像建房子一样, 一步一步组装起来, 就是一篇完整的文章了. 

本例子中的类关系如下:

依赖关系如下:

 

下面例子的github地址在这里: https://github.com/GoldArowana/design-patterns/tree/master/src/main/java/com/king/patterns/builder

Builder接口

定义了构建者的方法.

public interface Builder {
    void makeTitle(String title);

    void makeString(String str);

    void makeItems(String[] items);

    void close();
}

TextBuilder类

这是Builder接口的一个具体实现, 用于根据输入构建出类似Markdown风格的内容

public class TextBuilder implements Builder {
    private StringBuffer out = new StringBuffer();

    @Override
    public void makeTitle(String title) {
        out.append("==============================\n");
        out.append("『 " + title + " 』\n");
        out.append("\n");
    }

    @Override
    public void makeString(String str) {
        out.append("■ " + str + "\n");
        out.append("\n");
    }

    @Override
    public void makeItems(String[] items) {
        for (int i = 0; i < items.length; i++) {
            out.append(" ・" + items[i] + "\n");
        }
        out.append("\n");
    }

    @Override
    public void close() {
        out.append("==============================\n");
    }

    public String getResult() {
        return out.toString();
    }
}

Director类

这是一个指挥官, 利用Builder来进行组装内容

public class Director {
    private Builder builder;

    public Director(Builder builder) {              // 因为接收的参数是Builder类的子类
        this.builder = builder;                     // 所以可以将其保存在builder字段中
    }

    public void construct() {                       // 编写文档
        builder.makeTitle("Greeting");              // 标题
        builder.makeString("从早上至下午");         // 字符串
        builder.makeItems(new String[]{             // 条目
                "早上好。",
                "下午好。",
        });
        builder.makeString("晚上");                 // 其他字符串
        builder.makeItems(new String[]{             // 其他条目
                "晚上好。",
                "晚安。",
                "再见。",
        });
        builder.close();                            // 完成文档
    }
}

Main

本类用于运行测试

public class Main {
    public static void main(String[] args) {
        // 构建者
        TextBuilder textbuilder = new TextBuilder();
        
        // 指挥者
        Director director = new Director(textbuilder);
        
        // 构建
        director.construct();
        
        // 构建好的内容
        System.out.println(textbuilder.getResult());
    }
}

 运行结果如下:

 

posted @ 2018-05-08 17:51  GoldArowana  阅读(1002)  评论(0编辑  收藏  举报