03建造者模式(创建型模式)
• 场景:
– 我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样一个问题需要处理:
• 装配这些子组件是不是有个步骤问题?
– 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
• 建造模式的本质:
– 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
– 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
• 开发中应用场景:
– StringBuilder类的append方法
– SQL中的PreparedStatement
– JDOM中,DomBuilder、SAXBuilder
1 /** 2 * 宇宙飞船 3 */ 4 public class AirShip { 5 6 private OrbitalModule orbitalModule; //轨道舱 7 private Engine engine; //发动机 8 private EscapeTower escapeTower; //逃逸塔 9 10 11 public void launch(){ 12 System.out.println("发射!"); 13 } 14 15 16 17 public OrbitalModule getOrbitalModule() { 18 return orbitalModule; 19 } 20 public void setOrbitalModule(OrbitalModule orbitalModule) { 21 this.orbitalModule = orbitalModule; 22 } 23 public Engine getEngine() { 24 return engine; 25 } 26 public void setEngine(Engine engine) { 27 this.engine = engine; 28 } 29 public EscapeTower getEscapeTower() { 30 return escapeTower; 31 } 32 public void setEscapeTower(EscapeTower escapeTower) { 33 this.escapeTower = escapeTower; 34 } 35 36 37 38 } 39 40 class OrbitalModule{ 41 private String name; 42 43 public OrbitalModule(String name) { 44 this.name = name; 45 } 46 47 public String getName() { 48 return name; 49 } 50 51 public void setName(String name) { 52 this.name = name; 53 } 54 55 } 56 57 class Engine { 58 private String name; 59 60 public Engine(String name) { 61 this.name = name; 62 } 63 64 public String getName() { 65 return name; 66 } 67 68 public void setName(String name) { 69 this.name = name; 70 } 71 72 73 } 74 75 class EscapeTower{ 76 private String name; 77 78 public String getName() { 79 return name; 80 } 81 82 public void setName(String name) { 83 this.name = name; 84 } 85 86 public EscapeTower(String name) { 87 super(); 88 this.name = name; 89 } 90 91 } 92 93 public interface AirShipBuilder { 94 Engine builderEngine(); 95 OrbitalModule builderOrbitalModule(); 96 EscapeTower builderEscapeTower(); 97 } 98 99 public class MyAirShipBuilder implements AirShipBuilder { 100 //StringBuilder, XML解析中,JDOM库中的类:DomBuilder,SaxBuilder等都是使用的构建者模式 101 @Override 102 public Engine builderEngine() { 103 System.out.println("构建发动机!"); 104 // 这里可以使用工厂模式来搞一个发动机 105 return new Engine("发动机!"); 106 } 107 108 @Override 109 public EscapeTower builderEscapeTower() { 110 111 System.out.println("构建逃逸塔"); 112 return new EscapeTower("逃逸塔"); 113 } 114 115 @Override 116 public OrbitalModule builderOrbitalModule() { 117 System.out.println("构建轨道舱"); 118 return new OrbitalModule("轨道舱"); 119 } 120 121 } 122 123 public interface AirShipDirector { 124 125 /** 126 * 组装飞船对象 127 * @return 128 */ 129 AirShip directAirShip(); 130 131 } 132 133 public class MyAirshipDirector implements AirShipDirector { 134 135 private AirShipBuilder builder; 136 137 public MyAirshipDirector(AirShipBuilder builder) { 138 this.builder = builder; 139 } 140 141 142 @Override 143 public AirShip directAirShip() { 144 Engine e = builder.builderEngine(); 145 OrbitalModule o = builder.builderOrbitalModule(); 146 EscapeTower et = builder.builderEscapeTower(); 147 148 //装配成飞船对象 149 AirShip ship = new AirShip(); 150 ship.setEngine(e); 151 ship.setEscapeTower(et); 152 ship.setOrbitalModule(o); 153 154 return ship; 155 } 156 157 } 158 159 public class Client { 160 public static void main(String[] args) { 161 162 AirShipDirector director = new MyAirshipDirector(new MyAirShipBuilder()); 163 164 AirShip ship = director.directAirShip(); 165 166 System.out.println(ship.getEngine().getName()); 167 168 ship.launch(); 169 170 } 171 }

浙公网安备 33010602011771号