天天看點

設計模式:建造者模式(Builder Pattern)一、類圖二、模式含義三、代碼實作 四、總結

一、類圖

設計模式:建造者模式(Builder Pattern)一、類圖二、模式含義三、代碼實作 四、總結

二、模式含義

Product(産品角色):它是被建構的複雜對象,包含多個組成部件,具體建造者建立該産品的内部表示并定義它的裝配過程。

Builder(抽象建造者):它為建立一個産品Product對象的各個部件指定抽象接口,有兩類方法

a類方法: 是buildX(),它們用于建立對象的各個部件;

B類方法:是builder(),它們用于傳回産品對象。Builder既可以是抽象類,也可以是接口。

ConcreteBuilder(具體建造者):它實作了Builder接口,實作倆類方法的具體實作

三、代碼實作

package com.yan.pattern.builder;

public class Product {
	private String a;
	private int b;
	private Object c;
	public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}
	public Object getC() {
		return c;
	}
	public void setC(Object c) {
		this.c = c;
	}
	@Override
	public String toString() {
		return "Product [a=" + a + ", b=" + b + ", c=" + c + "]";
	}
	
}
           
package com.yan.pattern.builder;

public abstract class Builder {
	protected Product product = new Product();
	
	public abstract void builderA(String a);
	public abstract void builderB(int b);
	public abstract void builderC(Object c);
	
	public abstract Product builder();
}
           
package com.yan.pattern.builder;

public class ConcreteBuilder extends Builder{
	
	public void builderA(String a) {
		product.setA(a);
		
	}

	public void builderB(int b) {
		product.setB(b);
		
	}

	public void builderC(Object c) {
		product.setC(c);
		
	}
	
	//具體建構方式
	public Product builder() {
		builderA("12");
		builderB(34);
		builderC("56");
		
		return product;
	}

}
           

四、總結

建造者模式的核心:建構一個包含多個組成部件的完整對象,相同的建構過程建構不同的産品

一個擴充的思考?鈎子方法應用在此模式上

1.主要優點

      建造者模式的主要優點如下:

(1) 在建造者模式中,用戶端不必知道産品内部組成的細節,将産品本身與産品的建立過程解耦,使得相同的建立過程可以建立不同的産品對象。

(2) 每一個具體建造者都相對獨立,而與其他的具體建造者無關,是以可以很友善地替換具體建造者或增加新的具體建造者,使用者使用不同的具體建造者即可得到不同的産品對象。由于指揮者類針對抽象建造者程式設計,增加新的具體建造者無須修改原有類庫的代碼,系統擴充友善,符合“開閉原則”

(3) 可以更加精細地控制産品的建立過程。将複雜産品的建立步驟分解在不同的方法中,使得建立過程更加清晰,也更友善使用程式來控制建立過程。

2.主要缺點

      建造者模式的主要缺點如下:

(1) 建造者模式所建立的産品一般具有較多的共同點,其組成部分相似,如果産品之間的差異性很大,例如很多組成部分都不相同,不适合使用建造者模式,是以其使用範圍受到一定的限制。

(2) 如果産品的内部變化複雜,可能會導緻需要定義很多具體建造者類來實作這種變化,導緻系統變得很龐大,增加系統的了解難度和運作成本。

3.适用場景

      在以下情況下可以考慮使用建造者模式:

(1) 需要生成的産品對象有複雜的内部結構,這些産品對象通常包含多個成員屬性。

(2) 需要生成的産品對象的屬性互相依賴,需要指定其生成順序。

(3) 隔離複雜對象的建立和使用,并使得相同的建立過程可以建立不同的産品。

繼續閱讀