建造者模式

场景:
我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样一个问题需要处理:
装配这些子组件是不是有个步骤问题?
实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
建造模式的本质:
分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

 1 public class AirShip {
 2     private OrbitalModule orbitalModule;
 3     private Engine engine;
 4     private EscapeTower escapeTower;
 5 
 6     public void launch(){
 7         System.out.println("发射了。。。");
 8     }
 9     
10     public OrbitalModule getOrbitalModule() {
11         return orbitalModule;
12     }
13 
14     public void setOrbitalModule(OrbitalModule orbitalModule) {
15         this.orbitalModule = orbitalModule;
16     }
17 
18     public Engine getEngine() {
19         return engine;
20     }
21 
22     public void setEngine(Engine engine) {
23         this.engine = engine;
24     }
25 
26     public EscapeTower getEscapeTower() {
27         return escapeTower;
28     }
29 
30     public void setEscapeTower(EscapeTower escapeTower) {
31         this.escapeTower = escapeTower;
32     }
33 }
34 
35 class OrbitalModule{
36     private String name;
37 
38     public OrbitalModule(String name) {
39         this.name = name;
40     }
41 
42     public String getName() {
43         return name;
44     }
45 
46     public void setName(String name) {
47         this.name = name;
48     }
49 }
50 
51 class Engine{
52     private String name;
53 
54     public Engine(String name) {
55         this.name = name;
56     }
57 
58     public String getName() {
59         return name;
60     }
61 
62     public void setName(String name) {
63         this.name = name;
64     }
65 }
66 
67 class EscapeTower{
68     private String name;
69 
70     public String getName() {
71         return name;
72     }
73 
74     public void setName(String name) {
75         this.name = name;
76     }
77 
78     public EscapeTower(String name) {
79         super();
80         this.name = name;
81     }
82 }
AirShip
1 public interface AirShipBuilder {
2     Engine builderEngine();
3     OrbitalModule builderOrbitalMoudule();
4     EscapeTower builderEscapeTower();
5 }
AirShipBuilder
1 public interface AirShipDirector {
2     AirShip directAirShip();    
3 }
AirShipDirector
 1 public class SxtAirShipBuilder implements AirShipBuilder {
 2 
 3     @Override
 4     public Engine builderEngine() {
 5         System.out.println("构建发动机");
 6         return new Engine("payn牌发动机");
 7     }
 8 
 9     @Override
10     public OrbitalModule builderOrbitalMoudule() {
11         System.out.println("构建轨道舱");
12         return new OrbitalModule("payn牌轨道舱");
13     }
14 
15     @Override
16     public EscapeTower builderEscapeTower() {
17         System.out.println("构建逃逸塔");
18         return new EscapeTower("payn牌逃逸塔");
19     }
20 }
SxtAirShipBuilder
 1 public class SxtAirShipDirector implements AirShipDirector  {
 2     private AirShipBuilder builder;
 3 
 4     public SxtAirShipDirector(AirShipBuilder builder) {
 5         this.builder = builder;
 6     }
 7 
 8     @Override
 9     public AirShip directAirShip() {
10         Engine e = builder.builderEngine();
11         OrbitalModule o = builder.builderOrbitalMoudule();
12         EscapeTower et = builder.builderEscapeTower();
13 
14         //组装成飞船对象
15         AirShip airShip = new AirShip();
16         airShip.setEngine(e);
17         airShip.setEscapeTower(et);
18         airShip.setOrbitalModule(o);
19 
20         return airShip;
21     }
22 }
SxtAirShipDirector
 1 public class Client {
 2 
 3     public static void main(String[] args) {
 4         AirShipDirector director = new SxtAirShipDirector(new SxtAirShipBuilder());
 5         AirShip airShip = director.directAirShip();
 6         System.out.println(airShip.getEngine().getName());
 7         airShip.launch();
 8     }
 9     
10 }
Client


开发中应用场景:
StringBuilder类的append方法
SQL中的PreparedStatement
JDOM中,DomBuilder、SAXBuilder
Mybatis中,SqlSessionFactoryBuilder-->提供各种SqlSessionFactory的重载方法。



posted @ 2018-12-29 09:25  payn  阅读(134)  评论(0)    收藏  举报