這是設計模式系列的第二篇 —— 建造者設計模式,我希望推送的文章是一個系列的,盡量保持一樣的寫作風格,盡量把我理解的闡述清楚,關於建造者設計模式主要從以下幾個方面來學習,具體如下:
- 概述
- 本質
- 關鍵概念
- 具體實現
- 總結
概述#
建造者設計模式 (Builder Pattern) 屬於創建型設計模式,主要用於創建複雜的對象,可將複雜對象的構建過程抽象出來,通過不同實現的構建者和裝配者最終組裝出不同的對象,可以非常方便的增加不同實現的構建者、組裝者而不用修改以前的代碼。
本質#
建造者設計模式 (Builder Pattern) 分離了對象子組件的構造過程和組裝過程,實現了構建與組裝的解耦,不同的構建器相同的組裝順序以及相同的構建器不同的組裝順序都可以創建出不同的對象,使得構建與組裝充分解耦,進而實現構建算法與組裝算法的解耦,從而實現更好的複用。
關鍵概念#
-
構建者 (Builder):構建不同的子組件且返回子組件或者提供獲取複雜對象的方法,將構建過程抽象成接口或抽象類,方便擴展具體的不同的構建者。
-
組裝者 (Dirctor):通過某個具體的構建者構建相關的子組件,同時對外提供組成複雜產品對象的方法。
當需要生成複雜對象時,直接通過某個具體的組裝者獲得想要的具體對象即可,至於組裝過程與構建過程使用者不需要關心,分別由具體的組裝者與具體的構建者內部完成。當然複雜對象可以理解為具有很多屬性的對象。
具體實現#
下面以手機的組裝過程來說明建造者設計模式的具體實現,產品類如下:
/**
* 產品
*/
public class Phone {
private Screen screen;
private Camera camera;
private Cpu cpu;
//省略getter、setter、toString 方法
//...
}
//子組件
class Screen{
private String name;
//...
}
//子組件
class Camera{
private String name;
//...
}
//子組件
class Cpu{
private String name;
//...
}
抽象的構建者:
/**
* 構建者
*/
public interface PhoneBuilder {
Screen builderScreen();
Camera builderCamera();
Cpu builderCpu();
}
具體的構建者:
/**
* 具體的構建者
*/
public class MiPhoneBuilder implements PhoneBuilder{
@Override
public Screen builderScreen() {
System.out.println("構建屏幕...");
return new Screen("Mi-screen");
}
@Override
public Camera builderCamera() {
System.out.println("構建相機...");
return new Camera("Mi-camera");
}
@Override
public Cpu builderCpu() {
System.out.println("構建屏幕...");
return new Cpu("Mi-cpu");
}
}
抽象的組裝者:
/**
* 抽象的組裝者
*/
public interface PhoneDirector {
Phone directPhone();
}
具體的構建者:
/**
* 具體的組裝者
*/
public class MiPhoneDirector implements PhoneDirector{
private PhoneBuilder builder;
public MiPhoneDirector(PhoneBuilder builder) {
this.builder = builder;
}
@Override
public Phone directPhone() {
Phone phone = new Phone();
phone.setScreen(builder.builderScreen());
phone.setCamera(builder.builderCamera());
phone.setCpu(builder.builderCpu());
return phone;
}
}
使用者直接通過某個具體的組裝者獲取最終的產品,具體如下:
public class Client {
public static void main(String[] args) {
PhoneBuilder builder = new MiPhoneBuilder();
MiPhoneDirector director = new MiPhoneDirector(builder);
Phone phone = director.directPhone();
System.out.println(phone);
}
}
執行結果如下:
構建屏幕...
構建相機...
構建屏幕...
Phone [screen=Screen [name=Mi-screen], camera=Camera [name=Mi-camera], cpu=Cpu [name=Mi-cpu]]
最終,使用者通過具體的組裝者 MiPhoneDirector 組裝出一個具有明顯組裝特徵的手機,即一個屏幕是 Mi-screen 、相機是 Mi-camera、CPU 是 Mi-cpu 的手機。
總結#
建造者設計模式 (Builder Pattern) 一般用於具有共同特性的複雜對象,其對象本身與構建、組裝過程分離,可做到複雜對象屬性的可配置,當然,如果複雜對象內部過於複雜,勢必會需要創建更多的構建者類,使得構建過程繁瑣,我覺得開發中使用建造者設計模式主要用來做一些封裝,使得代碼寫起來更靈活,如 Picasso、Glide 的 API 就有建造者設計模式的使用,使得複雜對象的一些屬性可以做到可配置,非常方便。