定義
官方定義:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示,通俗的說就是:建造者模式就是如何一步步構建一個包含多個組成部件的對象,相同的構建過程可以創建不同的產品
特點
建造者模式是一種創建型模式,適用於那些流程固定,建造的目標對象會有所改變這種場景,還有一種場景是代替多參數構造器
作用
1、用戶不知道對象的建造過程和細節就可以創建出複雜的對象「屏蔽了建造的具體細節」
2、用戶只需給出複雜對象的內容和類型可以創建出對象
結構
Builder 接口或抽象類 抽象的建造者, 不是必須的
ConcreateBuilder 具體的構建者 可以有多個
Product 普通的類 被構建的對象
Director 指揮者 統一指揮構造者去建造目標
組裝Android 手機爲例
1、要建造的對象 AndroidPhone
public class AndroidPhone {
private int emmcSize;
private String cup;
public void setCup(String cup) {
this.cup = cup;
}
public void setEmmcSize(int emmcSize) {
this.emmcSize = emmcSize;
}
}
2、抽象的建造者 Builder
public interface Builder {
void setCup(String cup);
void setEmmcSize(int size);
AndroidPhone createPhone() ;
}
3、具體建造者 AssemblerBuilder
public class AssembleBuilder implements Builder{
private AndroidPhone androidPhone = new AndroidPhone();
@Override
public void setCup(String cup) {
androidPhone.setCup(cup);
}
@Override
public void setEmmcSize(int size) {
androidPhone.setEmmcSize(size);
}
@Override
public AndroidPhone createPhone() {
return androidPhone;
}
}
4、指揮者 Director
public class Director {
private Builder mBuilder;
public Director(Builder builder) {
mBuilder = builder;
}
public AndroidPhone createPhone(String cup, int size) {
mBuilder.setCup(cup);
mBuilder.setEmmcSize(size);
return mBuilder.createPhone();
}
}
5、測試類
public static void main(String[] args) {
Builder builder = new AssembleBuilder();
AndroidPhone androidPhone = new Director(builder).createPhone("mst618", 2048);
}
使用場景
1、如果一個對象有非常複雜的內部結構「這些產品通常有很多屬性」,那麼使用建造者模式
2、如果想把複雜對象的創建和使用分離開來,那麼使用建造者模式「使用相同的創建步驟可以創建不同的產品」
建造者模式與簡單工廠模式的差異
1、創建對象的粒度不同
工廠模式創建的是對象,而建造者模式創建的是一個複合產品,由各個複雜的部件組成。
2、關注點不同:
工廠模式注重只要把這個對象創建出來,而建造者模式不似要創造出這個產品,還有知道這個產品的組成部分