JAVA設計模式之 建造者模式【Builder Pattern】

小呂-ICE發表於2014-10-31

一、概述

    將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。核心在於如何一步步構建一個包含多個組成部件的完整物件,使用相同的構建過程構建不同的產品,建造者模式是一種物件建立型模式。


二、適用場景:複雜物件的組裝和建立

(1)    用於複雜物件的組裝和建立、物件間通常具有較多的共同點或是組成部分相似;

(2)    需要生成的物件的屬性相互依賴,需要指定其生成順序的情況;

(3)    物件的建立過程獨立於建立該物件的類,隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品;


三、UML類圖結構


四、參與者

1、Builder(抽象建造者):它為建立一個產品Product物件的各個部件指定抽象介面,並有方法返回產品物件。

2、ConcreteBuilder(具體建造者):它實現了Builder介面或抽象方法,實現各個部件的具體構造和裝配方法,定義並明確它所建立的複雜物件。

3、Product(產品角色):它是被構建的複雜物件,通常包含多個組成部件。

4、Director(指揮者):它負責安排複雜物件的建造次序,指揮者與抽象建造者之間存在關聯關係,可以在其construct()建造方法中呼叫建造者物件的部件構造與裝配方法,完成複雜物件的建造。


五、用例學習

1、被建造的物件:產品類 Product.java

/**
 * 被建造的物件:產品
 * @author  lvzb.software@qq.com
 *
 */
public class Product {
	// 產品部件A
	private String partA;
	// 產品部件B
    private String partB;
    // 產品部件C
 	private String partC;
 	
	public String getPartA() {
		return partA;
	}
	
	public void setPartA(String partA) {
		this.partA = partA;
	}
	
	public String getPartB() {
		return partB;
	}
	
	public void setPartB(String partB) {
		this.partB = partB;
	}
	
	public String getPartC() {
		return partC;
	}
	
	public void setPartC(String partC) {
		this.partC = partC;
	}

}
2、抽象建造者類[也可以為介面] Builder.java

/**
 * 抽象建造者
 * @author  lvzb.software@qq.com
 *
 */
public abstract class Builder {
	protected Product product = new Product();
	
	protected abstract void buildPartA();
	
	protected abstract void buildPartB();
	
	protected abstract void buildPartC();
	
	public Product getProduct(){
		return product;
	}

}
3、具體的複雜產品的建造者類 ConcreteBuilder.java

/**
 * 具體的建造者物件<br>
 * 建造複雜產品的各個組成部件、最後由指揮者類<Director>進行組裝成完整的產品物件
 * @author lvzb.software@qq.com
 *
 */
public class ConcreteBuilder extends Builder {

	@Override
	protected void buildPartA() {
		product.setPartA("build Part A");
		System.out.println("正在建造產品部件A");
	}

	@Override
	protected void buildPartB() {
		product.setPartB("build Part B");
		System.out.println("正在建造產品部件B");
	}

	@Override
	protected void buildPartC() {
		product.setPartC("build Part C");
		System.out.println("正在建造產品部件C");
	}

}
4、複雜產品的組裝 指揮者類:Director.java

/**
 * 指揮者<br>
 * 負責 安排/組裝 複雜物件的建造次序
 * @author  lvzb.software@qq.com
 *
 */
public class Director {
	private Builder builder;
	
	public Director(Builder builder){
		this.builder = builder;
	}
	
	
	/**
	 * 產品物件的構建與組裝
	 * @return
	 */
	public Product construct(){
		System.out.println("--- 指揮者開始 構建產品 ---");
		builder.buildPartA();
		builder.buildPartB();
		builder.buildPartC();
		System.out.println("--- 指揮者 構建產品 完成 ---");
		return builder.getProduct();
	}

}
5、客戶端呼叫測試類:Client.java

public class Client {

	public static void main(String[] args) {

		ConcreteBuilder cBuilder = new ConcreteBuilder();
		Director director = new Director(cBuilder);
		director.construct();
	}

}
6、程式執行效果:

--- 指揮者開始 構建產品 ---
正在建造產品部件A
正在建造產品部件B
正在建造產品部件C
--- 指揮者 構建產品 完成 ---

六、其他

    在建造者模式中,客戶端不必知道產品物件內部組成的細節,將產品本身與產品的建立過程解耦;每一個具體的建造者都相對獨立,可以方便修改/新增具體的建造者而不會對其他的建造者造成影響、使系統擴充套件方便,符合“開閉原則”。



相關文章