作者:佛祖上帝真主保佑我 | 来源:互联网 | 2023-05-19 07:23
GOF23设计模式之建造者模式场景:我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样的一个问题需要处理:装配这些子组件是不是有个步骤问题?实际开发中
GOF23设计模式之建造者模式
场景:
我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样的一个问题需要处理:
装配这些子组件是不是有个步骤问题?
实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
本质:
1)分离了对象子组件的单独构造(由 Builder 来负责)和装配(由 Director 负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
2)由于时下按了构建和装配的解耦。不同的构建起,相同的装配,也可以做出不同的对象;相同的构建起,不同的装配顺序也可以做出不同的对象。也就算实现了构建算法、装配算法的解耦,实现了更好的复用。
package cn.taosir.design.create.builders;
/**
* 宇宙飞船
* @author taosir
*
*/
public class AirShip {
private OrbitalModule orbitalModule;//轨道舱
private Engine engine;//发动机
private EscapeTower escapeTower;//逃逸塔
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 EscapeTower getEscapeTower() {return escapeTower;}
public void setEscapeTower(EscapeTower escapeTower) {this.escapeTower = escapeTower;}
}
class OrbitalModule{
private String name;
public OrbitalModule(String name) {super();this.name = name;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
class Engine{
private String name;
public Engine(String name) {super();this.name = name;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
class EscapeTower{
private String name;
public EscapeTower(String name) {super();this.name = name;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
package cn.taosir.design.create.builders;
public interface AirShipBuilder {
Engine builderEngine();
OrbitalModule builderOrbitalModule();
EscapeTower builderEscapeTower();
}
package cn.taosir.design.create.builders;
public interface AirShipDirector {
/**
* 组装飞船对象
* @return
*/
AirShip directAirShip();
}
package cn.taosir.design.create.builders;
public class TaoSirAirShipBuilder implements AirShipBuilder{
@Override
public Engine builderEngine() {
System.out.println("构建发动机...");
return new Engine("发动机");
}
@Override
public OrbitalModule builderOrbitalModule() {
System.out.println("构建轨道舱...");
return new OrbitalModule("轨道舱");
}
@Override
public EscapeTower builderEscapeTower() {
System.out.println("构建逃逸塔...");
return new EscapeTower("逃逸塔");
}
}
package cn.taosir.design.create.builders;
public class TaoSirAirShipDirector implements AirShipDirector{
private AirShipBuilder builder;
public TaoSirAirShipDirector(AirShipBuilder builder) {
this.builder=builder;
}
@Override
public AirShip directAirShip() {
Engine e=builder.builderEngine();
OrbitalModule o=builder.builderOrbitalModule();
EscapeTower et=builder.builderEscapeTower();
//装配飞船对象
AirShip ship=new AirShip();
ship.setEngine(e);
ship.setEscapeTower(et);
ship.setOrbitalModule(o);
return ship;
}
}
package cn.taosir.design.create.builders;
public class Client {
public static void main(String[] args) {
AirShipDirector director=new TaoSirAirShipDirector(new TaoSirAirShipBuilder());
AirShip ship = director.directAirShip();
System.out.println(ship.getEngine());
}
}
开发中的应用场景
StringBuilder类的append方法
SQL中的PreparedStatement
JDOM中,DomBuilder、SAXBuilder