创建者模式:一步一步构造一个复杂对象。用户指定对象类型和内容就可以构建该复杂对象,不需知道具体对象细节。
Builder:为创建一个Product对象的各个部件指定抽象接口
ConcreteBuilder:
利用创建者模式创建文件
Builder规定如何装配这些元素,组成一个文件(有不同的组合方式【不同的表示构造】)
Director类利用这个方法产生一份具体的文件。
client并不知道Builder接口有啥方法,只是调用Director的构造方法。
Director只有一个builder类。但是Director不知道调用buidler的哪个子类。
循序渐进地组合(不是一下子就生成一个对象!不是一下子就生成一个对象!不是一下子就生成一个对象!)一个较为复杂的对象实例,组合装配的过程在Director的Builder里面。生成时,才从Direcrtor中取出
每个ConcreteBuilder(XXXBuilder)只需要写一次。不同的Director就可以在相同部件的集合上,构造不同的Product
public abstract class Builder {
public abstract void makeTitle(String title);
public abstract void makeString(String str);
public abstract void makeItems(String[] items);
public abstract Object getResult();
}
Director里面可以看到,所有类型的文件的内容都是一样的,只是类型不同。
Director利用客户传来的“对象类型”来使用对应的builder来创建对应类型的文件。
public class Director {
private Builder builder;
public Director(Builder builder){ //客户手动指定要创建的对象类型
this.builder = builder;
}
public Object construt(){//文件的内容都是一样的,只是文件格式类型不一样 html txt
builder.makeTitle("文件的标题");
builder.makeString("从早上到白天結束"); // 字串
builder.makeItems(new String[]{ // 项目
"早安。",
"午安。",
});
builder.makeString("到了晚上"); // 另一个字串
builder.makeItems(new String[]{ // 另一个项目
"晚安。",
"祝你有个好梦。",
"再见。",
});
return builder.getResult(); // 完成的文件就是返回值
}
}
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class HTMLBuilder extends Builder{
private String filename;
private PrintWriter writer;
@Override
public Object getResult() {
writer.println("