基本介紹
1.建造者模式,又叫生成器模式
2.將復雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不同實現方法可以構造出不同表現(屬性)的對象
事項
1.優點
(1)易於解耦:客戶端不需要知道內部的具體構建細節,將產品本身與創建過程進行解耦,允許用戶只通過指定復雜對象的類型和內容就構建對象,使用相同的創建過程來得到不同的產品,符合依賴倒轉原則
(2)易於精准控制對象的創建:將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰
(3)易於擴展:增加新的具體構建者無需修改原有的代碼,易於擴展,符合開閉原則
2.缺點
(1)建造者模式所創建的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,其使用范圍受到一定的限制
(2)如果產品的內部變化復雜,導致需要定義很多具體建造者類來實現這種變化,導致系統變得龐大
3.抽象工廠模式、建造者模式
(1)抽象工廠模式:實現對產品家族的創建,一個產品家族是一系列產品,具有不同分類維度的產品組合,采用抽象工廠模式不需要關心構建過程,只關心什么產品由什么工廠生產即可
(2)建造者模式:要求按照指定的規范建造產品,主要目的是通過組裝零配件而產生一個新產品
4.應用場景
(1)需要生成的產品對象有復雜的內部結構,這些產品對象具備共性
(2)隔離復雜對象的創建和使用,並使得相同的創建過程可以創建不同的產品
(3)需要生成的對象內部屬性本身相互依賴
四種角色
1.產品: 一個具體的產品對象
2.抽象建造者: 創建一個產品對象的各個部件指定的接口/抽象類
(1)規范具體建造者的方法
(2)是多個規范相同的具體建造者的抽象
3.具體建造者: 實現接口/繼承抽象類
(1)在規范下,實現具體的建造方法
(2)一個具體建造者對應一個具體產品
4.指揮者: 構建一個使用抽象建造者的對象
(1)隔離客戶端與產品對象的生產過程
(2)控制產品對象的生產流程
(3)所有具體建造者的生產流程一致
JDK 中的 StringBuilder
1.Appendable 接口定義了多個 append 方法(抽象方法), 即 Appendable 為抽象建造者, 定義了抽象方法
2. AbstractStringBuilder 實現了 Appendable 接口方法,AbstractStringBuilder 已經是具體建造者,但不能實例化
3.StringBuilder 即充當了指揮者,同時充當了具體建造者,因為 StringBuilder 繼承了 AbstractStringBuilder,建造方法的實現由 AbstractStringBuilder 完成
代碼示例
public class Builder {//客戶端
public static void main(String[] args) {
//創建指揮者
Director director = new Director();
//傳入具體建造者
director.setAbstractBuilder(new ConcreteBuilder());
//生產產品並接收
Product product = director.build();
}
}
class Director {//指揮者
public AbstractBuilder abstractBuilder;
//傳入具體建造者,決定創建哪種產品
public void setAbstractBuilder(AbstractBuilder abstractBuilder) {
this.abstractBuilder = abstractBuilder;
}
//控制產品的生產流程
public Product build() {
abstractBuilder.Step();
return abstractBuilder.finish();
}
}
abstract class AbstractBuilder {//抽象建造者
public Product product = new Product();//初始化時是未完成品
//規范建造方法
public abstract void Step();
//建造完成,返回產品
public Product finish() {
return product;
}
}
class ConcreteBuilder extends AbstractBuilder {//Product的具體建造者
//實現建造方法
public void Step() {
}
}
class Product {//產品
}