一、類圖
二、模式含義
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) 隔離複雜對象的建立和使用,并使得相同的建立過程可以建立不同的産品。