什么是建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的建造过程可以创建不同的表示
UML图
由Director类定义建造顺序,在ConcreteBuilder类中进行对象的细节建造(当然ConcreteBuilder类需要知道用户对对象的要求),通过多态增加代码的灵活性。
工厂方法等相似的设计模式都是直接返回一个完整的对象,如果对对象的要求更加细致使用建造者模式是一个很好的选择。
本质
分离整体构建和局部构建
小练习
对于txt文件,xml文件的构建是类似的,都需要文件头,文件体以及文件尾。
使用建造者模式实现对于不同类型的文件的输出。
Director类
public class FileBuildDirector {
private static FileBuilder builder;
public static void buildeFile(FileBuilder builderr){
builder=builderr;
builder.buildHead();
builder.buildBody();
builder.buildLast();
}
public static FileAbstract getResult(){
return builder.getResult();
}
}
Builder类
public abstract class FileBuilder {
protected String firmId;
protected String user;
public FileBuilder(String firmId, String user) {
this.firmId = firmId;
this.user = user;
}
public abstract void buildHead();
public abstract void buildBody();
public abstract void buildLast();
public abstract FileAbstract getResult();
}
TxtBuilder类
public class TxtBuilder extends FileBuilder{
private TxtFile file=new TxtFile();
public TxtBuilder(String firmId, String user) {
super(firmId, user);
// TODO Auto-generated constructor stub
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
file.addHead(firmId);
}
@Override
public void buildBody() {
// TODO Auto-generated method stub
file.addBody();
}
@Override
public void buildLast() {
// TODO Auto-generated method stub
file.addLast(user);
}
@Override
public FileAbstract getResult() {
// TODO Auto-generated method stub
return file;
}
}
XmlBuilder类
public class XmlBuilder extends FileBuilder{
private String tableId;
private XmlFile file=new XmlFile(tableId);
@Override
public void buildHead() {
// TODO Auto-generated method stub
file.addHead(firmId);
}
@Override
public void buildBody() {
// TODO Auto-generated method stub
file.addBody();
}
@Override
public void buildLast() {
// TODO Auto-generated method stub
file.addLast(user);
}
@Override
public FileAbstract getResult() {
// TODO Auto-generated method stub
return file;
}
public XmlBuilder(String firmId, String user,String id) {
super(firmId, user);
tableId=id;
}
}
AbstractProduct类
public abstract class FileAbstract {
protected String head;
protected String body;
protected String last;
public abstract void addHead(String firmId);
public abstract void addBody();
public abstract void addLast(String user);
public void show(){
System.out.println(head);
System.out.println(body);
System.out.println(last);
}
}
TxtFile类
import java.util.Date;
public class TxtFile extends FileAbstract{
public void addHead(String firmId){
head=firmId+","+new Date();
}
public void addBody(){
body="txt文件";
}
public void addLast(String user){
last=user;
}
}
XmlFile类
import java.util.Date;
public class XmlFile extends FileAbstract{
private String tableId;
public XmlFile(String id) {
super();
tableId=id;
}
public void addHead(String firmId){
head=firmId+","+new Date();
}
public void addBody(){
body=tableId+" XML文件";
}
public void addLast(String user){
last=user;
}
}
test类
public class test {
public static void main(String[] args) {
TxtBuilder txtBuilder=new TxtBuilder("1","liuenzhen");
FileBuildDirector.buildeFile(txtBuilder);
FileBuildDirector.getResult().show();;
XmlBuilder xmlBuilder=new XmlBuilder("1","liuenzhen","1");
FileBuildDirector.buildeFile(txtBuilder);
FileBuildDirector.getResult().show();;
}
}
如果还需要增加其他类型文件的输出,只需要增添Builder类的具体实现,以及具体的文件类