1、前言
今天繼續介紹 Java 設計模式中的建立型模式–建造者模式。上篇設計模式的主題爲 《Java 設計模式之抽象工廠模式(三)》java
2、簡單介紹
建造者模式/生成器模式是一種對象建立型模式之一,用來隱藏複合對象的建立過程,它把複合對象的建立過程加以抽象,經過子類繼承和重載的方式,動態地建立具備複合屬性的對象。設計模式
建造者模式實現過程一般分紅 2 個步驟:構建(Builder)和裝配(Director)。此處的英文不是對漢字的翻譯而是爲了說明這兩個步驟須要用到的接口類型。ide
2.1 應用場景
1) 對象的建立:建造者模式是爲對象的建立而設計的模式。如:StringBuilder、DomBuilder、SAXBuilder。測試
2) 建立的是一個複合對象:被建立的對象爲一個具備複合屬性的複合對象。ui
3) 關注對象建立的各部分的建立過程:不一樣的工廠(Builder)對產品屬性有不一樣的建立方法。this
3、實現方式
一樣地,咱們仍是以建立轎車爲例。spa
實體類:.net
public class Car { private Engine engine; private Tyre tyre; private Seat seat; public void intro() { this.engine.intro(); this.tyre.intro(); this.seat.intro(); } public Engine getEngine() { return engine; } public void setEngine(Engine engine) { this.engine = engine; } public Tyre getTyre() { return tyre; } public void setTyre(Tyre tyre) { this.tyre = tyre; } public Seat getSeat() { return seat; } public void setSeat(Seat seat) { this.seat = seat; } } class Engine { public void intro() { System.out.println("開得快"); } } class Tyre { public void intro() { System.out.println("耐磨防滑"); } } class Seat { public void intro() { System.out.println("坐得溫馨"); } }
未使用建造者模式時,客戶端調用以下:Car 類的實例就是一個複合對象。翻譯
public class Client { public static void main(String[] args) { // 建立組裝部件 Engine engine = new Engine(); Tyre tyre = new Tyre(); Seat seat = new Seat(); // 組裝 Car car = new Car(); car.setEngine(engine); car.setTyre(tyre); car.setSeat(seat); car.intro(); } }
上邊的代碼中,違背了單一職責原則,客戶端與多個類進行了耦合,致使代碼擴展性不強。設計
接下來咱們使用建造者模式讓代碼變得靈活起來。
Builder 接口與實現類,用來實現構建過程:
public interface CarBuilder { Engine buildEngine(); Tyre buildTyre(); Seat buildSeat(); } class MyCarBuilder implements CarBuilder { @Override public Engine buildEngine() { return new Engine(); } @Override public Tyre buildTyre() { return new Tyre(); } @Override public Seat buildSeat() { return new Seat(); } }
此處使用了工廠模式建立組裝轎車的各個部件。不少時候,設計模式並非單獨使用,而是配合使用。
爲了編寫和測試方便,筆者沒有對 Engine、Tyre 和 Seat 類進行抽象。
Director 接口與實現類,用來實現裝配過程:
public interface CarDirector { Car directCar(); } class MyCarDirector implements CarDirector { private CarBuilder carBuilder; public MyCarDirector(CarBuilder carBuilder) { this.carBuilder = carBuilder; } @Override public Car directCar() { Engine engine = this.carBuilder.buildEngine(); Tyre tyre = this.carBuilder.buildTyre(); Seat seat = this.carBuilder.buildSeat(); // 裝配 Car car = new Car(); car.setEngine(engine); car.setTyre(tyre); car.setSeat(seat); return car; } }
經過 directCar 方法,隱藏複合對象(Car 實例)的建立過程。
客戶端:
public class Client { public static void main(String[] args) { CarDirector director = new MyCarDirector(new MyCarBuilder()); Car car = director.directCar(); car.intro(); } }
如今,客戶端代碼變得簡潔了。由於建造者模式遵循了依賴倒轉原則,咱們只要將客戶端的 Builder 或 Director 替換不一樣的接口實現類(多態),就能體現出代碼靈活性了。
UML 類圖表示以下: