模式動機
建造者模式(Builder Pattern)是最復雜的創建型模式,它用于創建一個包含多個組成部分的復雜物件,可以回傳一個完整的產品物件給用戶,它通過將客戶端與包含多個組成部分的復雜物件的創建程序分離,使得客戶端無需知道復雜物件的內部組成部分與裝配方式,只需要知道建造者的型別即可,它關注如何一步一步創建一個復雜物件,不同的具體建造者定義了不同的創建程序,且具體建造者相互獨立,增加新的建造者非常方便,系統具有較好的擴展性,
模式定義
- 建造者模式(Builder Pattern):將一個復雜物件的構建與它的表示分離,使得同樣的構建程序可以創建不同的表示,
- 建造者模式是一步一步創建一個復雜的物件,它允許用戶只通過指定復雜物件的型別和內容就可以構建它們,用戶不需要知道內部的具體構建細節,建造者模式屬于物件創建型模式,
模式結構

模式分析
產品:一個由多種組件組合生成的復雜物件
public class Product {
private String partA; //定義部件,部件可以是任意型別,包括值型別和參考型別
private String partB;
private String partC;
//partA的Getter方法和Setter方法省略
//partB的Getter方法和Setter方法省略
//partC的Getter方法和Setter方法省略
}
抽象建造者
public abstract class Builder {
//創建產品物件
protected Product product=new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//回傳產品物件
public Product getResult() {
return product;
}
}
具體建造者
public class ConcreteBuilder1 extends Builder{
public void buildPartA() {
product.setPartA("A1");
}
public void buildPartB() {
product.setPartB("B1");
}
public void buildPartC() {
product.setPartC("C1");
}
}
指揮者
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder=builder;
}
public void setBuilder(Builder builder) {
this.builder=builer;
}
//產品構建與組裝方法
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
客戶
......
Builder builder = new ConcreteBuilder1(); //可通過組態檔實作
Director director = new Director(builder);
Product product = director.construct();
......
-
模式優點
- 客戶端不必知道產品內部組成的細節,將產品本身與產品的創建程序解耦,使得相同的創建程序可以創建不同的產品物件
- 每一個具體建造者都相對獨立,與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,擴展方便,符合開閉原則
- 可以更加精細地控制產品的創建程序
-
模式缺點
- 建造者模式所創建的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,不適合使用建造者模式,因此其使用范圍受到一定的限制
- 如果產品的內部變化復雜,可能會需要定義很多具體建造者類來實作這種變化,導致系統變得很龐大,增加了系統的理解難度和運行成本
-
在以下情況下可以使用建造者模式
簡化
- 省略抽象建造者角色-(系統中只需要1個建造者時)
- 省略指揮者角色-(系統中只需要1個建造者是,省略抽象建造者、還可繼續省略指揮者,讓Builder角色扮演指揮者與建造者雙重角色
本文來自博客園,作者:街酒,轉載請注明原文鏈接:https://www.cnblogs.com/sorrymine/p/17387103.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/552098.html
標籤:其他
下一篇:返回列表
