建造者模式
场景:
我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样一个问题需要处理:
装配这些子组件是不是有个步骤问题?
实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
建造模式的本质:
分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
1 public class AirShip { 2 private OrbitalModule orbitalModule; 3 private Engine engine; 4 private EscapeTower escapeTower; 5 6 public void launch(){ 7 System.out.println("发射了。。。"); 8 } 9 10 public OrbitalModule getOrbitalModule() { 11 return orbitalModule; 12 } 13 14 public void setOrbitalModule(OrbitalModule orbitalModule) { 15 this.orbitalModule = orbitalModule; 16 } 17 18 public Engine getEngine() { 19 return engine; 20 } 21 22 public void setEngine(Engine engine) { 23 this.engine = engine; 24 } 25 26 public EscapeTower getEscapeTower() { 27 return escapeTower; 28 } 29 30 public void setEscapeTower(EscapeTower escapeTower) { 31 this.escapeTower = escapeTower; 32 } 33 } 34 35 class OrbitalModule{ 36 private String name; 37 38 public OrbitalModule(String name) { 39 this.name = name; 40 } 41 42 public String getName() { 43 return name; 44 } 45 46 public void setName(String name) { 47 this.name = name; 48 } 49 } 50 51 class Engine{ 52 private String name; 53 54 public Engine(String name) { 55 this.name = name; 56 } 57 58 public String getName() { 59 return name; 60 } 61 62 public void setName(String name) { 63 this.name = name; 64 } 65 } 66 67 class EscapeTower{ 68 private String name; 69 70 public String getName() { 71 return name; 72 } 73 74 public void setName(String name) { 75 this.name = name; 76 } 77 78 public EscapeTower(String name) { 79 super(); 80 this.name = name; 81 } 82 }
1 public interface AirShipBuilder { 2 Engine builderEngine(); 3 OrbitalModule builderOrbitalMoudule(); 4 EscapeTower builderEscapeTower(); 5 }
1 public interface AirShipDirector { 2 AirShip directAirShip(); 3 }
1 public class SxtAirShipBuilder implements AirShipBuilder { 2 3 @Override 4 public Engine builderEngine() { 5 System.out.println("构建发动机"); 6 return new Engine("payn牌发动机"); 7 } 8 9 @Override 10 public OrbitalModule builderOrbitalMoudule() { 11 System.out.println("构建轨道舱"); 12 return new OrbitalModule("payn牌轨道舱"); 13 } 14 15 @Override 16 public EscapeTower builderEscapeTower() { 17 System.out.println("构建逃逸塔"); 18 return new EscapeTower("payn牌逃逸塔"); 19 } 20 }
1 public class SxtAirShipDirector implements AirShipDirector { 2 private AirShipBuilder builder; 3 4 public SxtAirShipDirector(AirShipBuilder builder) { 5 this.builder = builder; 6 } 7 8 @Override 9 public AirShip directAirShip() { 10 Engine e = builder.builderEngine(); 11 OrbitalModule o = builder.builderOrbitalMoudule(); 12 EscapeTower et = builder.builderEscapeTower(); 13 14 //组装成飞船对象 15 AirShip airShip = new AirShip(); 16 airShip.setEngine(e); 17 airShip.setEscapeTower(et); 18 airShip.setOrbitalModule(o); 19 20 return airShip; 21 } 22 }
1 public class Client { 2 3 public static void main(String[] args) { 4 AirShipDirector director = new SxtAirShipDirector(new SxtAirShipBuilder()); 5 AirShip airShip = director.directAirShip(); 6 System.out.println(airShip.getEngine().getName()); 7 airShip.launch(); 8 } 9 10 }
开发中应用场景:
StringBuilder类的append方法
SQL中的PreparedStatement
JDOM中,DomBuilder、SAXBuilder
Mybatis中,SqlSessionFactoryBuilder-->提供各种SqlSessionFactory的重载方法。

浙公网安备 33010602011771号