1. 程式人生 > >GOF23設計模式之建造者模式(builder)

GOF23設計模式之建造者模式(builder)

gin 實例 情況 gof ace state 實現 oid sql

一、建造者模式概述

  建造者模式的本質:

    1.分離了對象子組件的單獨構造(由Builder負責)和裝配(由Director負責)。從而可以構造出復雜的對象。這個模式適用於:某個對象的過程復雜的情況下使用。

    2.由於實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的對象;相同的構建器,不同的裝配順序也可以做出不同的對象。也就是實現了構建算法,裝配算法的解耦,實現了更好的復用。

二、建造者模式

  1.創建飛船部件及飛船

 1 /**
 2  * 飛船
 3  * @author CL
 4  *
 5  */
 6 public class Airship {
 7
private 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 public
void 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 public
EscapeTower 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)