GOF23設計模式之建造者模式(builder)
阿新 • • 發佈:2017-12-29
gin 實例 情況 gof ace state 實現 oid sql
一、建造者模式概述
建造者模式的本質:
1.分離了對象子組件的單獨構造(由Builder負責)和裝配(由Director負責)。從而可以構造出復雜的對象。這個模式適用於:某個對象的過程復雜的情況下使用。
2.由於實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的對象;相同的構建器,不同的裝配順序也可以做出不同的對象。也就是實現了構建算法,裝配算法的解耦,實現了更好的復用。
二、建造者模式
1.創建飛船部件及飛船
1 /** 2 * 飛船 3 * @author CL 4 * 5 */ 6 public class Airship { 7private Engine engine; //發動機 8 private OrbitalMouble orbitalMouble; //軌道艙 9 private EscapeTower escapeTower; //逃逸塔 10 11 public void launch() { 12 System.out.println("發射!"); 13 } 14 15 public Engine getEngine() { 16 return engine; 17 } 18 publicvoid setEngine(Engine engine) { 19 this.engine = engine; 20 } 21 public OrbitalMouble getOrbitalMouble() { 22 return orbitalMouble; 23 } 24 public void setOrbitalMouble(OrbitalMouble orbitalMouble) { 25 this.orbitalMouble = orbitalMouble; 26 } 27 publicEscapeTower getEscapeTower() { 28 return escapeTower; 29 } 30 public void setEscapeTower(EscapeTower escapeTower) { 31 this.escapeTower = escapeTower; 32 } 33 34 } 35 36 /** 37 * 發動機類 38 */ 39 class Engine { 40 private String name; 41 42 public Engine(String name) { 43 this.name = name; 44 } 45 46 public String getName() { 47 return name; 48 } 49 50 public void setName(String name) { 51 this.name = name; 52 } 53 54 } 55 56 /** 57 * 軌道艙類 58 */ 59 class OrbitalMouble { 60 private String name; 61 62 public OrbitalMouble(String name) { 63 this.name = name; 64 } 65 66 public String getName() { 67 return name; 68 } 69 70 public void setName(String name) { 71 this.name = name; 72 } 73 } 74 75 /** 76 * 逃逸塔類 77 */ 78 class EscapeTower { 79 private String name; 80 81 public EscapeTower(String name) { 82 this.name = name; 83 } 84 85 public String getName() { 86 return name; 87 } 88 89 public void setName(String name) { 90 this.name = name; 91 } 92 }
2.創建飛船的構建接口和裝配接口
1 /** 2 * 飛船的構建者 3 * @author CL 4 * 5 */ 6 public interface AirshipBuilder { 7 /** 8 * 構建發動機 9 * @return 10 */ 11 Engine builderEngine(); 12 /** 13 * 構建軌道艙 14 * @return 15 */ 16 OrbitalMouble builderOrbitalMouble(); 17 /** 18 * 構建逃逸塔 19 * @return 20 */ 21 EscapeTower builderEscapeTower(); 22 }
1 /** 2 * 飛船的裝配者 3 * @author CL 4 * 5 */ 6 public interface AirshipDirector { 7 /** 8 * 裝配飛船 9 * @return 10 */ 11 Airship directorAirship(); 12 }
3.創建構建接口和裝配接口的實現類
1 /** 2 * XAAU牌飛船構建者的實現類 3 * @author CL 4 * 5 */ 6 public class XAAUAirshipBuilder implements AirshipBuilder { 7 8 public Engine builderEngine() { 9 System.out.println("構建發動機"); 10 return new Engine("XAAU牌發動機"); 11 } 12 13 public OrbitalMouble builderOrbitalMouble() { 14 System.out.println("構建軌道艙"); 15 return new OrbitalMouble("XAAU牌軌道艙"); 16 } 17 18 public EscapeTower builderEscapeTower() { 19 System.out.println("構建逃逸塔"); 20 return new EscapeTower("XAAU牌逃逸塔"); 21 } 22 23 }
1 /** 2 * XAAU牌飛船裝配者的實現類 3 * @author CL 4 * 5 */ 6 public class XAAUAirshipDirector implements AirshipDirector { 7 8 private AirshipBuilder builder; 9 10 public XAAUAirshipDirector(AirshipBuilder builder) { 11 this.builder = builder; 12 } 13 14 public Airship directorAirship() { 15 //構建飛船部件 16 Engine e = builder.builderEngine(); 17 OrbitalMouble o = builder.builderOrbitalMouble(); 18 EscapeTower et = builder.builderEscapeTower(); 19 20 //裝配成飛船對象 21 Airship ship = new Airship(); 22 ship.setEngine(e); 23 ship.setOrbitalMouble(o); 24 ship.setEscapeTower(et); 25 26 return ship; 27 } 28 29 }
4.測試
1 /** 2 * 利用建造者模式創建XAAU牌飛船對象的實例 3 * @author CL 4 * 5 */ 6 public class Client { 7 8 public static void main(String[] args) { 9 AirshipDirector director = new XAAUAirshipDirector(new XAAUAirshipBuilder()); 10 11 Airship ship = director.directorAirship(); 12 13 System.out.println(ship.getEngine().getName()); 14 System.out.println(ship.getOrbitalMouble().getName()); 15 System.out.println(ship.getEscapeTower().getName()); 16 17 ship.launch(); 18 } 19 }
控制臺輸出:
構建發動機
構建軌道艙
構建逃逸塔
XAAU牌發動機
XAAU牌軌道艙
XAAU牌逃逸塔
發射!
三、建造者模式常見應用場景
(1)StringBuilder類中的append方法;
(2)SQL中的PreparedStatement;
(3)JDOM中,DomBuilder、SAXBuilder;
(4)………………
GOF23設計模式之建造者模式(builder)