Java學習筆記之--------建造者模式

使用場景

我們需要構建一個複雜的產品。比如:電腦,手機,飛船。這個複雜產品的創建,有這樣一個問題需要處理:裝配子組件是不是需要特定的步驟?

實際開發中,我們所需要的對象構建時,也非常複雜,有很多步驟需要處理時,我們就可能需要想到建造者模式。

建造者模式的本質

建造者模式又稱生成器模式,建造者模式分離了對象子組件的單獨構造(由builder來負責)和裝配(由director負責)。從而可以構造出複雜的對象。這個模式適用於:某個對象的構造過程比較複雜的時候。

由於實現了構建和裝配的解耦,不同的構造器,相同的裝配可以做出不同的對象;相同的構造器,不同的裝配也可以做出不同的對象。也就是實現了構建算法、裝配算法的解耦,實現了更好的複用。

創建者模式的優點:將一個復對象的創建過程封裝起來。允許對象通過多個步驟來創建,並且可以改變過程(這和只有一個步驟的工廠模式不同)。向客戶隱藏產品內部的實現。產品的實現可以被替換,因爲客戶只看到一個抽象的接口。

建造者模式demo

我們需要一臺臺式機,這臺臺式機由顯示器、主機、鼠標、鍵盤組成。具體代碼如下:

public class Computer {
	//顯示器
	private Monitor monitor;
	//主機
	private Host host;
	//鍵盤
	private Keyboard keyboard;
	//鼠標
	private Mouse mouse;

	public void open(){
		System.out.println("打開電腦!");
	}
	public Monitor getMonitor() {
		return monitor;
	}
	public void setMonitor(Monitor monitor) {
		this.monitor = monitor;
	}
	public Host getHost() {
		return host;
	}
	public void setHost(Host host) {
		this.host = host;
	}
	public Keyboard getKeyboard() {
		return keyboard;
	}
	public void setKeyboard(Keyboard keyboard) {
		this.keyboard = keyboard;
	}
	public Mouse getMouse() {
		return mouse;
	}
	public void setMouse(Mouse mouse) {
		this.mouse = mouse;
	}
}
public class Monitor {
	private String name;
	public Monitor(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
} 
public class Host {
	private String name;
	public Host(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
} 
public class Keyboard {
	private String name;
	public Keyboard(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
public class Mouse {
	private String name;
	public Mouse(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
} 
public interface ComputerBuilder {
	Monitor buildMonitor();
	Keyboard buildKeyboard();
	Host buildHost();
	Mouse buildMouse();
}
public class TestComputerBuilder implements ComputerBuilder {
	@Override
	public Monitor buildMonitor() {
		System.out.println("構建顯示器");
		return new Monitor("顯示器");
	}
	@Override
	public Host buildHost() {
		System.out.println("構建主機");
		return new Host("主機");
	}
	@Override
	public Keyboard buildKeyboard() {
		System.out.println("構建鍵盤");
		return new Keyboard("鍵盤");
	}
	@Override
	public Mouse buildMouse() {
		System.out.println("構建鼠標");
		return new Mouse("鼠標");
	}
}
public interface ComputerDirector {
	/**
	 * 組裝電腦
	 * @return
	 */
	Computer dircetComputer();
}
public class TestComputerDirector implements ComputerDirector {
	private ComputerBuilder computerBuilder;
	public TestComputerDirector(ComputerBuilder computerBuilder) {
		this.computerBuilder = computerBuilder;
	}
	@Override
	public Computer dircetComputer() {
		Monitor monitor = computerBuilder.buildMonitor();
		Keyboard keyboard = computerBuilder.buildKeyboard();
		Host host = computerBuilder.buildHost();
		Mouse mouse = computerBuilder.buildMouse();
		//裝配成臺式機
		Computer computer = new Computer();
		computer.setHost(host);
		computer.setKeyboard(keyboard);
		computer.setMonitor(monitor);
		computer.setMouse(mouse);
		return computer;
	}
}
public class Client {
	public static void main(String[] args) {
		ComputerDirector director = new TestComputerDirector(new TestComputerBuilder());
		Computer c = director.dircetComputer();
		System.out.println(c.getKeyboard());
		c.open();
	}
} 

運行結果如下:

類圖

這裏將Keyboard、Host、Monitor、Mouse四個類省略了,不然生成的類圖十分龐大。

開發中的應用場景

StringBuilder類的append方法

SQL中的preparedSataement

JDOM中的DomBuilder,SAXBuilder

(以Builder結尾的類大多都應用了構建者模式)

 

以上爲建造者模式的學習筆記,此文章爲尚學堂視頻的學習筆記+自己總結。參考資料:Head First 設計模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章