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 }
View Code

 

posted @ 2018-05-27 20:07  jqbai  阅读(84)  评论(0)    收藏  举报