建造者模式(Builder)是創建者模式的一種,是一種負責創建對象的模式。
模式的場景和本質
在實際開發中,有的時候我們需要創建的對象十分複雜,有時候需要很多步奏來處理。
建造者模式的任務就是分離和對象子組件的單獨構造(由Builder負責)和裝配(由Director負責),從而構造出複雜的對象。使用的場景就是構造比較複雜的對象。
由於實現了構造和裝配的解耦。不同的構造器,相同的裝配,也可以做出不同的對象;相同的構造器,不同的構造順序也可以做出不同的對象。也就是實現了構造算法,裝配算法的解耦,實現了更好的複用。
模式的實現
在這樣的設計模式中,有以下幾個角色:
1 builder:爲創建一個產品對象的各個部件指定抽象接口。
2 ConcreteBuilder:實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並 提供一個檢索產品的接口。
3 Director:構造一個使用Builder接口的對象。
4 Product:表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
簡單的實例代碼如下
//模式角色product 創建的具體對象
public class AirShip {
public OrbitalModule orbitalModule;//軌道倉
public Engine engine;//引擎
public Escapelower escapelower;//逃逸艙
public OrbitalModule getOrbitalModule() {
return orbitalModule;
}
public void setOrbitalModule(OrbitalModule orbitalModule) {
this.orbitalModule = orbitalModule;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public Escapelower getWscapelower() {
return escapelower;
}
public void setEscapelower(Escapelower escapelower) {
this.escapelower = escapelower;
}
}
//模式角色ConcreteBuilder,負責創建對象的各個部分
public interface AirShipBuilder {
OrbitalModule createOrbitalModule();
Engine createEngine();
Escapelower createEscapelower();
}package pattern;
//模式角色Director,負責對象的裝配
public interface AirShipDirector {
AirShip createAirShip();//組裝飛船對象
}
//AirShipBuilder的實現類
public class MyAirShipBuilder implements AirShipBuilder{
public Engine createEngine() {
Engine e = new Engine();
return e;
}
public Escapelower createEscapelower() {
Escapelower el = new Escapelower();
return el;
}
public OrbitalModule createOrbitalModule() {
OrbitalModule o = new OrbitalModule();
return o;
}
}
//AirShipDirector的實現
public class MyAirShipDirector implements AirShipDirector{
private AirShipBuilder builder = new MyAirShipBuilder();
public void setBuilder(AirShipBuilder builder) {
this.builder = builder;
}
public AirShip createAirShip() {
OrbitalModule orbitalModule = builder.createOrbitalModule();
Engine engine =builder.createEngine();
Escapelower escapelower = builder.createEscapelower();
AirShip airShip = new AirShip();
airShip.setOrbitalModule(orbitalModule);
airShip.setEngine(engine);
airShip.setEscapelower(escapelower);
return airShip;
}
}
如果是比較複雜的對象的創建,這樣以來會把一些邏輯和操作分開來,方便管理和理解。