创建者模式
场景
- 我们要建造一个复杂的产品,比如:神州飞船、Iphone。这个复杂的产品的创建,有这样一个问题需要处理装配这些字子组件是不是有个步骤问题
- 实际开发中,我们所需要的对象构建是,也非常复杂,有很多步骤需要处理时
建造模式的本质
分离了对象子组件的单独构造(有Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象,这个模式适用于:某个对象的构建过程复杂的情况下使用
由于实现了构建和装配的解耦,不同的构造器,相同的装配,也可以做出不同的对象;相同的构建起,不同的装配顺序也可以做出不同的对象;也就是实现了构建算法,装配算法的解耦,实现了更好的复用
结构
- Builder 抽象建造者接口,规范各个组成部分的构建。
- ConcreteBuilder 具体建造者角色,实现组成部分的构建,并提供示例。
- Product 产品角色,创建返回的对象。
- Director 导演者角色,负责创建以及使用。
结构图

代码示例
/**
* 宇宙飞船
*/
public class AirShip {
private OrbitalModule orbitalModule ;//轨道舱模块
private Engine engine; //发动机
private EscapePower escapePower; //逃逸塔
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 EscapePower getEscapePower() {
return escapePower;
}
public void setEscapePower(EscapePower escapePower) {
this.escapePower = escapePower;
}
}
class OrbitalModule{
String orbitalNme;
public OrbitalModule(String orbitalNme) {
super();
this.orbitalNme = orbitalNme;
}
public String getOrbitalNme() {
return orbitalNme;
}
public void setOrbitalNme(String orbitalNme) {
this.orbitalNme = orbitalNme;
}
}
class Engine{
private String engineName;
public Engine(String engineName) {
this.engineName = engineName;
}
public String getEngineName() {
return engineName;
}
public void setEngineName(String engineName) {
this.engineName = engineName;
}
}
class EscapePower{
private String escapePowerName ;
public EscapePower(String escapePowerName) {
this.escapePowerName = escapePowerName;
}
public String getEscapePowerName() {
return escapePowerName;
}
public void setEscapePowerName(String escapePowerName) {
this.escapePowerName = escapePowerName;
}
}
/**
* 构建子组件
*/
public interface AirShipBuilder {
Engine builderEgine();
OrbitalModule builderOrbitalModule();
EscapePower builderEscapePower();
}
public class SxtAirShipBuilder implements AirShipBuilder {
@Override
public Engine builderEgine() {
System.out.println("构建发动机");
return new Engine("发动机");
}
@Override
public OrbitalModule builderOrbitalModule() {
System.out.println("构建轨道舱模块");
return new OrbitalModule("轨道舱模块");
}
@Override
public EscapePower builderEscapePower() {
System.out.println("构建逃逸塔");
return new EscapePower("逃逸塔");
}
}
/**
* 装配
*/
public interface AirShipDirector {
/**
* 组装airship
* @return
*/
AirShip directorAirShip();
}
/**
* 组装宇宙飞船 装备者调用构建者创建对象
*/
public class SxtAirShipDirector implements AirShipDirector {
AirShipBuilder builder;
public SxtAirShipDirector(AirShipBuilder builder) {
this.builder = builder;
}
@Override
public AirShip directorAirShip() {
Engine engine =builder.builderEgine();
OrbitalModule orbitalModule = builder.builderOrbitalModule();
EscapePower escapePower =builder.builderEscapePower();
//组装
AirShip airShip = new AirShip();
airShip.setEngine(engine);
airShip.setEscapePower(escapePower);
airShip.setOrbitalModule(orbitalModule);
return airShip;
}
}
public class Client {
public static void main(String[] args){
AirShipBuilder builder = new SxtAirShipBuilder();
AirShipDirector director = new SxtAirShipDirector(builder);
AirShip ship = director.directorAirShip();
System.out.println(ship.getEngine().getEngineName());
System.out.println(ship.getOrbitalModule().getOrbitalNme());
System.out.println(ship.getEscapePower().getEscapePowerName());
}
}
开发中的应用场景
- StringBuilder类的append方法
- SQL中的PrepareStatement
- JDOM中,DomBuilder、SAXBuilder
建造者模式解析
本文介绍了建造者模式的应用场景、本质及结构,通过宇宙飞船的例子详细解释了如何将复杂对象的构建过程分解为单独构建和装配两个阶段,展示了该模式如何提高代码的复用性和灵活性。

被折叠的 条评论
为什么被折叠?



