建造者模式(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;
}
}
如果是比较复杂的对象的创建,这样以来会把一些逻辑和操作分开来,方便管理和理解。