Builder模式
程序员文章站
2022-06-04 18:21:37
...
Builder模式
Builder模式用于组装具有复杂结构的实例。
示例程序
这里使用Builder模式编写文档程序,它包含一个标题,含有几个字符串,含有条目项目。
1、Builder类
Builder类中只定义了决定文档结构的方法,具体是HTML结构的,还是JSON结构的,这些都交个子类处理。
package com.design.pattern7;
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();
}
2、Director类
Director类主要是调用Builder子类处理后的文档结构,向文档结构里增加数据(文本),以此来编写文档。它并不关心Builder具体长什么样,只要知道文档结构即可。
package com.design.pattern7;
public class Director {
private Builder 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();
}
}
3、HTMLBuilder类(Builder子类)
package com.design.pattern7;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class HTMLBuider extends Builder{
private String fileName;
private PrintWriter writer;
@Override
public 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
public void makeString(String str) {
writer.println("<p>"+str+"</p>");
}
@Override
public void makeItems(String[] items) {
writer.println("<ul>");
for (String str:items) {
writer.println("<li>"+str+"</li>");
}
writer.println("</ul>");
}
@Override
public void close() {
writer.println("</body></html>");
writer.close();
}
public String getResult(){
return fileName;
}
}
4、Main类
package com.design.pattern7;
public class Main {
public static void main(String[] args) {
HTMLBuider htmlBuider = new HTMLBuider();
Director director = new Director(htmlBuider);
director.construct();
String result = htmlBuider.getResult();
System.out.println(result);
}
}
生成的文档(问候语.html)
<html><head><title>问候语</title></head><body>
<h1>问候语</h1>
<p>从上午到下午</p>
<ul>
<li>早上好</li>
<li>下午好</li>
</ul>
<p>晚上</p>
<ul>
<li>晚上好</li>
<li>晚安</li>
<li>再见</li>
</ul>
</body></html>
Builder模式需要三个元素:
1、Builder(建造者)
负责定义用于生成实例的接口(API)/方法。
2、ConcreteBuilder(具体的建造者)
负责实现Builder定义的方法。
3、Director(监工)
负责使用Builder的方法来生成实例。
因为不知道才能被替换(可替换性)
Director知道Builder类,并调用Builder的方法来编写文档,但是他不知道自己究竟使用的是Builder的哪个子类,只有不知道子类才能替换,不论是将HTMLBuilder还是其他子类的实例传递给Director,它都能正常工作。
上一篇: webpack面试题合集