1. Builder模式
组装具有复杂结构的实例。正如建造一栋大楼,需要自下而上地一层一层的建造。我们需要做的是建造组成这个物体的各个部分,然后分阶段将它们组装起来。
1.1 Builder模式的类图
登场的角色
- Builder(建造者)
定义用于生成实例的接口(API),即定义了需要的各个组件。 - ConcreteBuilder(具体的建造者)
具体实现了Builder的接口(API) - Director(指导者)
调用Builder的方法构造成所需的完整的对象。 - Client(使用者)
使用该模式的类
1.2 示例程序
类一览表
名字 | 说明 |
---|---|
Builder | 定义了最终对象结构的方法的抽象类 |
Director | 使用Builder建造最终的结果 |
TextBuilder | 一个实现了Builder的类 |
Main | 测试类 |
uml类图
代码实现
Builder类
package xin.ajay.builder.impl;
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();
}
Director类
package xin.ajay.builder.impl;
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;
}
public void construct(){
builder.makeTitle("Greeting");
builder.makeString("早上——下午");
builder.makeItems("早上号","下午好");
builder.makeString("晚上");
builder.makeItems("晚上好","晚安","再见");
builder.close();
}
}
TextBuilder类
package xin.ajay.builder.impl;
public class TextBuilder extends Builder {
private StringBuilder builder = new StringBuilder();
@Override
public void makeTitle(String title) {
builder.append("=======================\n");
builder.append("〖"+title+"〗\n");
builder.append("\n");
}
@Override
public void makeString(String str) {
builder.append("● ");
builder.append(str);
builder.append("\n");
builder.append("\n");
}
@Override
public void makeItems(String... items) {
for (String item : items) {
builder.append(" · " + item + "\n");
}
builder.append("\n");
}
@Override
public void close() {
builder.append("=======================\n");
}
public String getResult(){
return builder.toString();
}
}
Main类
package xin.ajay.builder.impl;
public class Main {
public static void main(String[] args) {
TextBuilder textBuilder = new TextBuilder();
Director director = new Director(textBuilder);
director.construct();
String result = textBuilder.getResult();
System.out.println(result);
}
}
鸣谢
GoF《设计模式》和结城浩的《图解设计模式》