博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图解设计模式-Builder模式
阅读量:6038 次
发布时间:2019-06-20

本文共 2977 字,大约阅读时间需要 9 分钟。

用于组装具有复杂结构的实例叫做Builder模式。
抽象类Builder中定义了组装需要用的所用方法。
抽象类的每种具体实现(TextBuilder于HTMLBuilder)中定义了各自的组装时需要的个性化方法。
Director组装类中定义了组装的顺序。
 
角色:
Builder建造者:负责定义用于生成实例的接口API。Builder角色中准备了用于生成实例的方法。示例中由Builder类扮演。
ConcreteBuilder具体的建造者:负责实现Builder角色的接口类,这里定义了在生成实例时实际被调用的方法。有TextBuilder于HTMLBuilder类扮演。
Director监工:使用Builder具体类中声明的方法来编写文档。它不依赖与具体的类,,为了确保不论ConcreteBuilder角色如何定义,Director角色都能正常工作,它只调用在Builder抽象类中定义的方法。
Client使用者:使用Builder模式,Main方法。
优点:
针对抽象类编写,不针对具体类编程,解耦。
组装的具体实现被隐藏在Director类中。
Director类中定义了具体的construct方法,使用了Template Method模式。
 
代码:
public abstract class Builder {    //规定了组装需要用的所用方法    public abstract void makeTitle(String title);    public abstract void makeString(String str);    public abstract void makeItems(String[] items);    public abstract void close();}
public class Director {    private Builder builder;    public Director(Builder builder) {        this.builder = builder;    }    //规定了组装的顺序    public void construct() {        builder.makeTitle("标题");        builder.makeString("内容内容内容内容1");        builder.makeItems(new String[] {"条目1","条目2"});        builder.makeString("内容内容内容内容2");        builder.makeItems(new String[] {"条目3","条目4"});        builder.close();    }}
//构建text时,每个方法(组件)需要实现内容public class TextBuilder extends Builder {    private StringBuilder stringBuilder = new StringBuilder();    //定义了各自的组装时需要的个性化方法    @Override    public void makeTitle(String title) {        stringBuilder.append(title);        stringBuilder.append("\n");    }    @Override    public void makeString(String str) {        stringBuilder.append(str);        stringBuilder.append("\n");    }    @Override    public void makeItems(String[] items) {        for(int i=0;i
//构建Html时,每个方法(组件)需要实现内容public class HtmlBuilder extends Builder{    private String filename;    private PrintWriter printWriter;    //定义了各自的组装时需要的个性化方法    @Override    public void makeTitle(String title) {        filename = title + ".html";        try {            printWriter = new PrintWriter(new FileWriter("d:\\"+filename));            printWriter.println(title);        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void makeString(String str) {        printWriter.println(str);    }    @Override    public void makeItems(String[] items) {        for(int i=0;i
public class Main {    public static void main(String[] args) {        //构建text        TextBuilder textBuilder = new TextBuilder();        Director director = new Director(textBuilder);        //进行构建        director.construct();        String result = textBuilder.getResult();        System.out.println(result);        //构建Html        HtmlBuilder htmlBuilder = new HtmlBuilder();        director = new Director(htmlBuilder);        //进行构建        director.construct();        String resultHtml = htmlBuilder.getResult();        System.out.println(resultHtml);    }}

 

转载于:https://www.cnblogs.com/use-D/p/9581453.html

你可能感兴趣的文章
下午考
查看>>
创建字符设备的三种方法
查看>>
走在网页游戏开发的路上(六)
查看>>
nginx 配置的server_name参数(转)
查看>>
Uva592 Island of Logic
查看>>
C++基础代码--20余种数据结构和算法的实现
查看>>
footer固定在页面底部的实现方法总结
查看>>
nginx上传文件大小
查看>>
数字通信原理笔记(一)---概述
查看>>
HDU 2243 考研路茫茫——单词情结(自动机)
查看>>
Dubbo OPS工具——dubbo-admin & dubbo-monitor
查看>>
Dungeon Master ZOJ 1940【优先队列+广搜】
查看>>
Delphi 中的 XMLDocument 类详解(5) - 获取元素内容
查看>>
2013年7月12日“修复 Migration 测试发现的 Bug”
查看>>
学习vue中遇到的报错,特此记录下来
查看>>
CentOS7 编译安装 Mariadb
查看>>
jstl格式化时间
查看>>
一则关于运算符的小例
查看>>
centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署
查看>>
cronexpression 详解
查看>>