設計模式之建造者設計模式
這是設計模式系列的第二篇——建造者設計模式,我希望推送的文章是一個系列的,儘量保持一樣的寫作風格,儘量把我理解的闡述清楚,關於建造者設計模式主要從以下幾個方面來學習,具體如下:
- 概述
- 本質
- 關鍵概念
- 具體實現
- 總結
概述
建造者設計模式(Builder Pattern)屬於建立型設計模式,主要用於建立複雜的物件,可將複雜物件的構建過程抽象出來,通過不同實現的構建者和裝配者最終組裝出不同的物件,可以非常方便的增加不同實現的構建者、組裝者而不用修改以前的程式碼。
本質
建造者設計模式(Builder Pattern)分離了物件子元件的構造過程和組裝過程,實現了構建與組裝的解耦,不同的構建器相同的組裝順序以及相同的構建器不同的組裝順序都可以創建出不同的物件,使得構建與組裝充分解耦,進而實現構建演算法與組裝演算法的解耦,從而實現更好的複用。
關鍵概念
-
構建者(Builder):構建不同的子元件且返回子元件或者提供獲取複雜物件的方法,將構建過程抽象成介面或抽象類,方便擴充套件具體的不同的構建者。
-
組裝者(Dirctor):通過某個具體的構建者構建相關的子元件,同時對外提供組成複雜產品物件的方法。
當需要生成複雜物件時,直接通過某個具體的組裝者獲得想要的具體物件即可,至於組裝過程與構建過程使用者不需要關心,分別由具體的組裝者與具體的構建者內部完成。當然複雜物件可以理解為具有很多屬性的物件。
具體實現
下面以手機的組裝過程來說明建造者設計模式的具體實現,產品類如下:
/**
* 產品
* @author jzman
*/
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;
//...
}
抽象的構建者:
/**
* 構建者
* @author jzman
*/
public interface PhoneBuilder {
Screen builderScreen();
Camera builderCamera();
Cpu builderCpu();
}
具體的構建者:
/**
* 具體的構建者
* @author jzman
*/
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");
}
}
抽象的組裝者:
/**
* 抽象的組裝者
* @author jzman
*/
public interface PhoneDirector {
Phone directPhone();
}
具體的構建者:
/**
* 具體的組裝者
* @author jzman
*/
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 就有建造者設計模式的使用,使得複雜物件的一些屬性可以做到可配置,非常方便。
可以選擇關注微信公眾號:jzman-blog 獲取最新更新,一起交流學習!