设计模式学习笔记——建造者(Builder)模式
@(设计模式)[设计模式, 建造者模式, builder]
基本介绍
建造者模式的最主要思想是:将分散的各个组件,组装起来,形成一个整体。
建造者案例
类图
实现代码
Builder抽象类
package com.pc.builder.example;
import java.util.List;
/**
* 建造者类
* Created by Switch on 2017-02-13.
*/
public abstract class Builder {
/**
* 创建标题
*
* @param title 标题
*/
public abstract void makeTitle(String title);
/**
* 创建字符串
*
* @param str 字符串
*/
public abstract void makeString(String str);
/**
* 创建条目
*
* @param items 条目列表
*/
public abstract void makeItems(List<String> items);
/**
* 关闭
*/
public abstract void close();
}
Director类
package com.pc.builder.example;
import java.util.ArrayList;
import java.util.List;
/**
* 导演类
* Created by Switch on 2017-02-13.
*/
public class Director {
// builder对象
private Builder builder;
/**
* 构造方法,传入builder对象
*
* @param builder 建造者对象
*/
public Director(Builder builder) {
this.builder = builder;
}
/**
* 构建文档
*/
public void construct() {
// 创建标题
builder.makeTitle("Greeting");
// 创建字符串
builder.makeString("Switch");
// 创建条目
List<String> list1 = new ArrayList<>();
list1.add("早上好");
list1.add("中午好");
list1.add("晚上好");
builder.makeItems(list1);
// 创建字符串
builder.makeString("Kity");
// 创建条目
List<String> list2 = new ArrayList<>();
list2.add("晚上好");
list2.add("中午好");
list2.add("早上好");
builder.makeItems(list2);
// 完成,关闭文档
builder.close();
}
}
TextBuilder类
package com.pc.builder.example;
import java.util.List;
/**
* 文本Builder
* Created by Switch on 2017-02-13.
*/
public class TextBuilder extends Builder {
// 文本保存对象
private StringBuilder stringBuilder = new StringBuilder();
@Override
public void makeTitle(String title) {
stringBuilder.append("==============================\n");
stringBuilder.append("[" + title + "]\n");
stringBuilder.append("\n");
}
@Override
public void makeString(String str) {
stringBuilder.append("》" + str + "\n");
stringBuilder.append("\n");
}
@Override
public void makeItems(List<String> items) {
for (String item : items) {
stringBuilder.append("》》》" + item + "\n");
}
stringBuilder.append("\n");
}
@Override
public void close() {
stringBuilder.append("==============================\n");
}
/**
* 获取文本
*
* @return 文本字符串
*/
public String getResult() {
return stringBuilder.toString();
}
}
HTMLBuilder类
package com.pc.builder.example;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
/**
* 超文本Builder
* Created by Switch on 2017-02-13.
*/
public class HTMLBuilder extends Builder {
// 文件名
private String filename;
// 编写文档的PrintWriter对象
private PrintWriter writer;
@Override
public void makeTitle(String title) {
// 将标题作为文件名
this.filename = title + ".html";
try {
// 创建PrintWriter对象
writer = new PrintWriter(new FileWriter("E:\\" + filename));
} catch (IOException e) {
e.printStackTrace();
}
writer.println("<html><head><title>" + title + "</title>");
writer.println("<meta charset='UTF-8'></meta>");
writer.println("</head><body>");
// 输出标题
writer.println("<h1>" + title + "</h1>");
}
@Override
public void makeString(String str) {
writer.println("<p>" + str + "</p>");
}
@Override
public void makeItems(List<String> items) {
writer.println("<ul>");
for (String item : items) {
writer.println("<li>" + item + "</li>");
}
writer.println("</ul>");
}
@Override
public void close() {
writer.println("</body></html>");
writer.close();
}
/**
* 获取文件名
*
* @return 文件名
*/
public String getResult() {
return this.filename;
}
}
测试类
package com.pc.builder.example.test;
import com.pc.builder.example.Director;
import com.pc.builder.example.HTMLBuilder;
import com.pc.builder.example.TextBuilder;
import org.junit.Test;
/**
* 建造者测试类
* Created by Switch on 2017-02-13.
*/
public class BuilderTest {
}
测试方法
@Test
public void testTextBuilder() {
// 创建文本Builder对象
TextBuilder builder = new TextBuilder();
// 创建Director类
Director director = new Director(builder);
// 创建文本
director.construct();
// 获取结果
String result = builder.getResult();
System.out.println(result);
}
运行结果
==============================
[Greeting]
》Switch
》》》早上好
》》》中午好
》》》晚上好
》Kity
》》》晚上好
》》》中午好
》》》早上好
==============================
测试方法
@Test
public void testHTMLBuilder() {
// 创建超文本Builder对象
HTMLBuilder builder = new HTMLBuilder();
// 创建Director类
Director director = new Director(builder);
// 创建文本
director.construct();
// 获取结果
String result = builder.getResult();
System.out.println(result);
}
运行结果
控制台输出
Greeting.html
E盘下Greeting.html的内容
<html><head><title>Greeting</title>
<meta charset='UTF-8'></meta>
</head><body>
<h1>Greeting</h1>
<p>Switch</p>
<ul>
<li>早上好</li>
<li>中午好</li>
<li>晚上好</li>
</ul>
<p>Kity</p>
<ul>
<li>晚上好</li>
<li>中午好</li>
<li>早上好</li>
</ul>
</body></html>
浏览器中运行结果
建造者模式中的角色
Builder(建造者)
Builder
角色负责定义用于生成实例的接口(API
)。Builder
角色中准备了用于生成实例的方法。
在案例中,由Builder
类扮演此角色。
ConcreteBuilder(具体的建造者)
ConcreteBuilder
角色是负责实现Builder
角色的接口的类(API
)。这里定义了在生成实例时实际被调用的方法。此外,在ConcreteBuilder
角色中还定义了获取最终生成结果的方法。在案例中,由TextBuilder
类和HTMLBuilder
类扮演此角色。
Director(监工)
Director
角色负责使用Builder
角色的接口(API
) 来生成实例。它并不依赖于ConcreteBuilder
角色。为了确保不论ConcreteBuilder
角色是如何被定义的,Director
角色都能正常工作,它只调用在Builder
角色中被定义的方法。在案例中,由Director
类扮演此角色。
Client(使用者)
该角色使用了Builder
模式(在GoF
的书中,Builder
模式并不包含Client
角色)。在案例中,由测试类扮演此角色。
类图
时序图
GitHub:DesignPatternStudy
——————参考《图解设计模式》