1、場景
我們需要建造一個比較複雜的產品,如神舟飛船。這個產品創建起來非常的複雜,它肯定是由很多的零件先組成組件,然後組件再組成產品的,那麼就會涉及到組件組裝的順序問題。
實際開發中,我們所需要的對象創建時,非常的複雜,有很多的步驟需要處理的時候。
2、建造者模式的本質
分離了對象子組件的單獨構造(由Builder來負責)和裝配(由Director負責)。從而可以構造出複雜的對象,這個模式適用於:某個對象的構建過程複雜的情況下使用。
由於實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的對象。相同的構建器,相同的裝配順序也可以做出不同的對象。也就是實現了構建算法和裝配算法的解耦,實現了更好的複用。
3、代碼實現
我們還是以Car爲例,使用建造者模式來構建一輛Car。Car主要由三個組件組成:發動機、輪胎和座椅。
3.1 創建組件類
3.1.1 發動機
package com.zdw.builder;
public class Engine {
private String name;
public Engine(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.1.2 輪胎
package com.zdw.builder;
public class Tyre {
private String name;
public Tyre(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.1.3 座椅類
package com.zdw.builder;
public class Seat {
private String name;
public Seat(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.2 創建Car類
package com.zdw.builder;
public class Car {
private Engine engine;
private Seat seat;
private Tyre tyre;
public Seat getSeat() {
return seat;
}
public void setSeat(Seat seat) {
this.seat = seat;
}
public Tyre getTyre() {
return tyre;
}
public void setTyre(Tyre tyre) {
this.tyre = tyre;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
//車子的功能方法
public void run(){
System.out.println("我的發動機是:"+engine.getName()+"==我的輪胎是:"+tyre.getName()+"==我的座椅是:"+seat.getName());
System.out.println("我是一輛跑的好快的車子奧啊啊啊");
}
}
3.3 創建Builder接口和實現類
3.3.1 ICarBuilder接口
package com.zdw.builder;
public interface ICarBuilder {
Engine builderEngine();
Seat BuilderSeat();
Tyre createTyre();
}
3.3.2 CarBuilderImpl實現類
package com.zdw.builder;
public class CarBuilderImpl implements ICarBuilder {
@Override
public Engine builderEngine() {
return new Engine("永久牌發動機");
}
@Override
public Seat BuilderSeat() {
return new Seat("德利座椅");
}
@Override
public Tyre createTyre() {
return new Tyre("米其林輪胎");
}
}
3.4 創建Director的接口和實現類
3.4.1 ICarDirector接口
package com.zdw.builder;
public interface ICarDirector {
Car directorCar();//組裝車子的方法
}
3.4.2 CarDirectorImpl實現類
package com.zdw.builder;
public class CarDirectorImpl implements ICarDirector {
private ICarBuilder carBuilder;
public CarDirectorImpl(ICarBuilder carBuilder) {
this.carBuilder = carBuilder;
}
@Override
public Car directorCar() {
Engine engine = carBuilder.builderEngine();
Seat seat = carBuilder.BuilderSeat();
Tyre tyre = carBuilder.createTyre();
Car car = new Car();
car.setEngine(engine);
car.setSeat(seat);
car.setTyre(tyre);
return car;
}
}
3.5 測試
package com.zdw.builder;
public class TestBuilder {
public static void main(String[] args) {
ICarDirector carDirector = new CarDirectorImpl(new CarBuilderImpl());
Car car = carDirector.directorCar();
car.run();
}
}
3.6 應用場景
StringBuilder的append()方法;
SQL中PreparedStatement對象;
JDOM中的DomBuilder,SAXBuilder對象。