GOF23设计模式之建造者模式(builder)
一、建造者模式概述
建造者模式的本质:
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)………………