//生成器模式:把整體構建算法和部件構造進行分離的設計模式
//實例:導出txt格式文件和xml格式文件
//前提,txt文件和xml文件有相同的內容格式,分別是頭文件,文件體和文件尾
//抽象(使用場景):當多個對象具有相同的過程而有不同的表示時分離
//未使用生成器模式的解決方案
public class ExportToTxt {
public void export(ExportHeaderModel ehm,Map<String,Collection<ExportDataModel>> mapData,ExportFooterModel efm) {
StringBuffer buffer = new StringBuffer();
buffer.append("文件頭");
buffer.append("文件體");
buffer.append("文件尾");
System.out.println(buffer);
}
}
public class ExportToXml {
public void export(ExportHeaderModel ehm,Map<String,Collection<ExportDataModel>> mapData,ExportFooterModel efm) {
StringBuffer buffer = new StringBuffer();
buffer.append("文件頭");//這裏抽象表示出了生成過程,而沒有給出具體的實現
buffer.append("文件體");//這樣即可看出txt和xml文件生成的過程是一樣的,只是具體實現不一樣
buffer.append("文件尾");//這個時候用生成器模式是合適的,他把邏輯算法部分和具體實現部分分離,鬆散了耦合
System.out.println(buffer);
}
}
//===================================================================================
//引入生成器模式
public interface Builder {
public void buildHeader(ExportHeaderModel ehm);
public void buildBody(Map<String,Collection<ExportDataModel>> mapData);
public void buildFooter(ExportFooterModel efm);
}
public class TxtBuilder implements Builder {
private StringBuffer buffer = new StringBuffer();
public void buildBody(Map<String,Collection<ExportDataModel>> mapData) {
//省略
}
public void buildHeader(ExportHeaderModel ehm) {
//省略
}
public void buildFooter(ExportFooterModel efm) {
//省略
}
public StringBuffer getResult() {
return buffer;
}
}
public class XmlBuilder implements Builder {
private StringBuffer buffer = new StringBuffer();
public void buildBody(Map<String,Collection<ExportDataModel>> mapData) {
//省略
}
public void buildHeader(ExportHeaderModel ehm) {
//省略
}
public void buildFooter(ExportFooterModel efm) {
//省略
}
public StringBuffer getResult() {
return buffer;
}
}
//指導者,即過程指導者
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
//指導過程
public void construct(ExportHeaderModel ehm,Map<String,Collection<ExportDataModel>> mapData,ExportFooterModel efm) {
builder.buildHeader(ehm);
builder.buildBody(mapData);
builder.buildFooter(efm);
}
}
//客戶端調用
public class Client {
public static void main(String[] args) {
//生成ehm,mapData,efm內容
TxtBuilder txtBuilder = new TxtBuilder();
Director director = new Director(txtBuilder);
director.construct(ehm,mapData,efm);
System.out.println(txtBuilder.getResult());
XmlBuilder xmlBuilder = new XmlBuilder();
Director director = new Director(xmlBuilder);
director.construct(ehm,mapData,efm);
System.out.println(xmlBuilder.getResult());
}
}
//這樣的話,只要處理過程(算法)是不變的,那麼就可以實現多種數據格式導出的擴展
//生成器模式使得具體表現具有擴展性,而不用多次編寫處理過程,提高了代碼重用
設計模式入門之生成器模式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.