图解设计模式
来源:互联网 发布:华东政法研究生知乎 编辑:程序博客网 时间:2024/06/02 03:47
读书笔记 仅供参考
Builder 模式用于组装具有复杂结构的实例。
角色和 UML
Builder:负责定义用于生成实例的接口。
ConcreteBuilder:负责实现 Builder 角色的接口。定义了在生成实例时实际被调用的方法,还定义了获取最终生成结果的方法。
Director:负责使用 Builder 角色的接口来生成实例。
Client: 该角色来使用 Builder 模式(可以忽略)
例子
程序例子是实现采用两种方式编写文档,一个是纯文本,一个是 html 文本。写入最基本的文本,最后得到经过渲染的文本,在组装文本的过程中使用了 Builder 模式。
Builder 抽象类,担任上述的 Builder 角色,定义组装每一部分的接口。
public abstract class Builder { abstract void makeTitle(String title); abstract void makeString(String str); abstract void makeItems(String[] items); abstract void close();}
Director 类,担任上述的 Director 角色,调用了 Builder 定义的接口,进行实例的组装。
public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public void construct() { builder.makeTitle("Greeting"); builder.makeString(" 从早上至下午 "); builder.makeItems(new String[] { " 早上好。", " 下午好。", }); builder.makeString(" 晚上 "); builder.makeItems(new String[] { " 晚上好 ", " 晚安。", " 再见。", }); builder.close(); }}
TextBilder 类继承 Builder 类,担任上述 ConcreteBilder 角色,实现组装实例的接口细节。
public class TextBilder extends Builder { private StringBuffer buffer = new StringBuffer(); @Override void makeTitle(String title) { buffer.append("===============================\n"); buffer.append("[" + title + "]\n"); buffer.append("\n"); } @Override void makeString(String str) { buffer.append('◼' + str + "\n"); buffer.append("\n"); } @Override void makeItems(String[] items) { for(int i = 0; i < items.length; i++) { buffer.append(" ." + items[i] + "\n"); } buffer.append("\n"); } @Override void close() { buffer.append("===============================\n"); } public String getResult() { return buffer.toString(); }}
和上者相同。
public class HtmlBuilder extends Builder { private String fileName; private PrintWriter writer; @Override void makeTitle(String title) { fileName = title + ".html"; try { writer = new PrintWriter(new FileWriter(fileName)); } catch (IOException e) { e.printStackTrace(); } writer.println("<html><head><title>" + title + "</title></head><body>"); writer.println("<h1>" + title + "</h1>"); } @Override void makeString(String str) { writer.println("<p>" + str + "</p>"); } @Override void makeItems(String[] items) { writer.println("<ul>"); for(int i = 0; i < items.length; i++) { writer.println("<li>" + items[i] + "</li>"); } writer.println("</ul>"); } @Override void close() { writer.println("</body></html>"); writer.close(); } public String getResult() { return fileName; }}
Main 类,担任上述的 Client 角色,负责测试结果。
public class Main { public static void main(String[] args) { //生成纯文本 TextBilder textBilder = new TextBilder(); Director director = new Director(textBilder); director.construct(); String result = textBilder.getResult(); System.out.println(result); //生成 HTML HtmlBuilder htmlBuilder = new HtmlBuilder(); Director director2 = new Director(htmlBuilder); director2.construct(); String fileName = htmlBuilder.getResult(); System.out.println(fileName + " 文件编写完成。"); }}
结果
UML
相关的设计模式
Template Method
在 Builder 模式中,Director 类定义了模板的流程。
Composite
有些情况下 Builder 模式生成的实例构成了 Composite 模式。
Abstract Factory
都用于生成复杂的实例。
Facade
Facade 通过组合内部模块向外部提过可以简单调用的接口。
扩展
Effective Java - 创建和销毁对象 - 遇到多个构造器参数时要考虑用构建器
阅读全文
0 0
- 设计模式图解
- gof23设计模式图解
- 图解设计模式
- 图解基础设施设计模式
- 设计模式图解
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 图解设计模式
- 自顶向下,逐步求精的程序设计方法。
- 【总结】尺取模板
- SpringBoot中设置Hibernate format_sql
- 自定义ButterKnife
- 如何创建一个最简单的Linux自启动服务?
- 图解设计模式
- S11关联容器
- 【2017.11.29】2.Add Two Numbers
- MyBatis 动态SQL
- the difference between isinstance and type in python
- 求一个数的阶乘
- 怎样解决在Word中插入公式后行距变宽了
- NLTK找出最频繁的名词标记的程序(代码详细解释)
- 66. Plus One 加一运算