赤赤元
有梦想的咸鱼
 1 /**
 2  * 作用:
 3  * 将复杂物体的构建与表现相分离。
 4  * 組成角色:
 5  * 1)建造者(Builder):負責定義用來生成實例的接口(API)
 6  * 2)具体的建造者(ConcreateBuilder):负责实现Builder角色定义的接口实现类。
 7  *   针对不同的业务逻辑,具体化复杂对象的各部分的创建。在建造完成之后提供产品的实例。
 8  * 3)监工(Director):Director角色负责使用Builder角色的接口API来生成实例。内部不涉及具体产品信息,只负责
 9  *   保证对象各部分完整创建或按照某种顺序进行创建。即Director是负责指挥如何build的,只负责调度,具体实施交给具体的建造者。
10  * 4)产品(Product):即要创建的复杂对象。
11  * 5)使用者(Client):实际使用Builder模式的角色,即下面的测试类。
12  * 
13  * 优缺点:
14  *   封装性:客户端不必知道产品内部组合细节,只需关心我们要生成的某个对象,具体对象产生细节不必知晓。
15  *   建造者独立,易于扩展:案例只列举了ConcreateBuilder建造者类,如果需要其它建造者新建类即可。建造者之间彼此独立,系统扩展性好,符合开闭原则。
16  *   便于控制细节风险:由于具体建造者是独立的,因此可以对具体建造过程中逐步细化,不会对其他模块产生影响。
17  * 
18  * 应用场景
19  *   产品类非常复杂,不同的调度产生不同的结果时,使用建造者模式比较适合;
20  *   相同的组件或配件都可以装配到一个对象,但是产生的结果又不相同,可以使用建造者模式。
21  *   
22  *建造者模式VS工厂模式
23  *  建造者模式关注零件类型和装配顺序,同为创建型模式,注重点不同。
24  *  工厂模式只有一个建造方法,而建造者有多个建造零件并且强调建造顺序,而工厂模式没有顺序的概念。
25  *
26  * @author mcebgadmin
27  *
28  */

 1 //产品类,要建造的对象
 2 public class Product {
 3     private String ground;
 4     private String cement;
 5     private String roof;
 6     
 7     public Product() {
 8         
 9     }
10     public String getGround() {
11         return ground;
12     }
13     public void setGround(String ground) {
14         this.ground = ground;
15     }
16     public String getCement() {
17         return cement;
18     }
19     public void setCement(String cement) {
20         this.cement = cement;
21     }
22     public String getRoof() {
23         return roof;
24     }
25     public void setRoof(String roof) {
26         this.roof = roof;
27     }
28 
29 }
30 /**
31  * 建造者角色
32  *
33  */
34 public interface Builder {
35     //一般來說,有多少零配件,就有多少建造方法
36     void buildGround();
37     void buildCement();
38     void buildRoof();
39     
40     //返回產品類
41     Product builProduct();
42 
43 }
44 /**
45  * 建造者的實現類
46  *
47  */
48 public class ConcreteBuilder implements Builder {
49     private final Product product=new Product();
50 
51     @Override
52     public void buildGround() {
53         System.out.println("build地基");
54         product.setGround("build地基");
55     }
56 
57     @Override
58     public void buildCement() {
59         System.out.println("build水泥");
60         product.setCement("build水泥");
61     }
62 
63     @Override
64     public void buildRoof() {
65         System.out.println("build樓頂");
66         product.setRoof("build樓頂");
67     }
68 
69     @Override
70     public Product builProduct() {
71         System.out.println("建造完畢!");
72         return product;
73     }
74 
75 }
76 /**
77  * 監工,負責指揮builder如何建造即如何調度
78  */
79 public class Director {
80     public Builder builder;
81     public Director(Builder builder) {
82         this.builder=builder;
83     }
84     
85     public Product construct() {
86         //構建順序:建造水泥->地基->樓頂
87         builder.buildCement();
88         builder.buildGround();
89         builder.buildRoof();
90         
91         return builder.builProduct();
92     }
93 
94 }

 

 

 

posted on 2020-06-15 15:06  赤赤元  阅读(163)  评论(0编辑  收藏  举报