目錄
概述
建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個複雜的對象。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立於其他對象的。
建造者模式:將一個複雜對象的構建與它的表示分離,使得相同的構建過程可以創建不同的表示。
它關注如何一步一步的創建一個複雜的對象,如果用了建造者模式,那麼用戶就只需要指定需要建造的類型就可以得到它們,而具體建造的過程和細節就不需要知道了。
工廠類模式提供的是創建單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來創建複合對象,所謂複合對象就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來得到的。
主要解決:主要解決在軟件系統中,有時候面臨着"一個複雜對象"的創建工作,其通常由各個部分的子對象用一定的算法構成;其組合是經常變化的。
數據結構
Product: 最終要生成的對象,例如 Computer實例。
Builder: 構建者的抽象基類(有時會使用接口代替)。其定義了構建Product的抽象步驟,其實體類需要實現這些步驟。其會包含一個用來返回最終產品的方法Product getProduct()
。
ConcreteBuilder: Builder的實現類。
Director: 決定如何構建最終產品的算法. 其會包含一個負責組裝的方法void Construct(Builder builder)
, 在這個方法中通過調用builder的方法,就可以設置builder,等設置完成後,就可以通過builder的 getProduct()
方法獲得最終的產品。
優缺點
優點: 1、建造者獨立,易擴展。 2、便於控制細節風險。
缺點: 1、產品必須有共同點,範圍有限制。 2、如內部變化複雜,會有很多的建造類。
使用場景: 1、需要生成的對象具有複雜的內部結構。 2、需要生成的對象內部屬性本身相互依賴。
注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。
實現
Product類:
public class Product {
List<String> parts=new ArrayList<>();
public void add(String part){
parts.add(part);
}
public void show(){
System.out.print("產品創建");
for(String p:parts){
System.out.print(p+" ");
}
System.out.println();
}
}
Builder類
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product GetResult();
}
ConcreteBuilder1
public class ConcreteBuilder1 extends Builder{
Product product=new Product();
@Override
public void buildPartA() {
product.add("A");
}
@Override
public void buildPartB() {
product.add("B");
}
@Override
public Product GetResult() {
return product;
}
}
ConcreteBuilder2
public class ConcreteBuilder2 extends Builder{
Product product=new Product();
@Override
public void buildPartA() {
product.add("X");
}
@Override
public void buildPartB() {
product.add("Y");
}
@Override
public Product GetResult() {
return product;
}
}
HouseDirector
public class Director {
public void Construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
}
}
Client
public class Client {
public static void main(String[] args) {
Director director=new Director();
Builder builder1=new ConcreteBuilder1();
Builder builder2=new ConcreteBuilder2();
director.Construct(builder1);
Product p1=builder1.GetResult();
p1.show();
}
}