設計模式入門之生成器模式

//生成器模式:把整體構建算法和部件構造進行分離的設計模式
//實例:導出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());
	}
}
//這樣的話,只要處理過程(算法)是不變的,那麼就可以實現多種數據格式導出的擴展
//生成器模式使得具體表現具有擴展性,而不用多次編寫處理過程,提高了代碼重用

發佈了45 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章