设计模式--创建模式--建造者模式

一、基本概念

     1、创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象。

     2、角色

    A.建造者角色(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,以规范产品对象的各个组成部分的建造。这个接口规定了要实现复杂对象的哪个部分的创建,但并不涉及具体对象不见的创建。
    B.具体创建者角色(ConcreateBuilder):实现Builder接口,针对不同的业务逻辑,具体化复杂对象的各个部分的创建。
    C.指导者(Director)调用具体建造者来创建复杂对象的各个部分,在指导者中不设计具体产品的信息,只负责保证对象各部分完整创建或者按某种顺序创建。
    D.产品(Product):它是包含多个组成部件的复杂对象,有具体建造者来创建其各个部件。
    E.客户端(Client):测试者。

     3、场景

   大家看过《交换空间》这个栏目栏目,在每一期节目中,都将会有两个家庭互换空间进行装修。在这次装修挑战中,栏目组将会提供20000元装修预算,及10000元家电基金,每个家庭都会配备一名优秀的设计师和若干装修技术工人。装修风格存在差异,装修步骤我们一致时。

二、简单例子

  A.建造者角色(Builder):

 1 package comm.pattern.create.builder;
 2 
 3 /**
 4  * 
 5  * @Title: Builder.java
 6  * @Package: comm.pattern.create.builder
 7  * @Description: 抽象创建者
 8  * @author yangzhancheng
 9  * @2020年3月25日:下午4:20:31
10  *
11  */
12 public interface IBuilder {
13 
14     void buildFloor();
15 
16     void buildKitchen();
17 
18     void buildWall();
19 
20     //创建产品(房屋)整体
21     Product getProduct();
22 }
View Code

  B.具体创建者角色(ConcreateBuilder):

      B-1:

 1 package comm.pattern.create.builder;
 2 
 3 /**
 4  * 
 5  * @Title: Product.java
 6  * @Package: comm.pattern.create.builder
 7  * @Description:设计师A
 8  * @author yangzhancheng
 9  * @2020年3月25日:下午4:17:26
10  *
11  */
12 public class BuilderA implements IBuilder{
13 
14     private Product product = new Product("A.奥先生");
15      
16     public void buildFloor(){
17         product.setFloor("A.罗马式大理石。");
18     }
19 
20     public void buildKitchen(){
21         product.setKitchen("A.带有吧台的厨房,便于男主小酌一杯。");
22     }
23 
24     public void buildWall(){
25         product.setWall("A.文艺复兴欧式复古墙面。");
26     }
27 
28     //创建产品(房屋)整体
29     public Product getProduct(){
30         return product;
31     }
32 }
View Code

      B-2:

 1 package comm.pattern.create.builder;
 2 
 3 /**
 4  * 
 5  * @Title: Product.java
 6  * @Package: comm.pattern.create.builder
 7  * @Description:设计师B
 8  * @author yangzhancheng
 9  * @2020年3月25日:下午4:17:26
10  *
11  */
12 public class BuilderB implements IBuilder{
13 
14     private Product product = new Product("B.妙女士");
15      
16     public void buildFloor(){
17         product.setFloor("B.日式榻榻米风格。");
18     }
19 
20     public void buildKitchen(){
21         product.setKitchen("B.开放式小清新田园风格。");
22     }
23 
24     public void buildWall(){
25         product.setWall("B.淡雅木质构件。");
26     }
27 
28     //创建产品(房屋)整体
29     public Product getProduct(){
30         return product;
31     }
32 }
View Code

  C.指导者(Director):

 1 package comm.pattern.create.builder;
 2 
 3 /**
 4  * 
 5  * @Title: BuilderDirector.java
 6  * @Package: comm.pattern.create.builder
 7  * @Description: 指导者
 8  * @author yangzhancheng
 9  * @2020年3月25日:下午5:00:28
10  *
11  */
12 public class BuilderDirector {
13 
14     private IBuilder builder = null;
15 
16     public BuilderDirector(IBuilder builder){
17         this.builder = builder;
18     }
19 
20     public Product build(){
21         builder.buildFloor();
22         builder.buildWall();
23         builder.buildKitchen();
24         return builder.getProduct();
25     }
26     
27 }
View Code

  D.产品(Product):

 1 package comm.pattern.create.builder;
 2 
 3 /**
 4  * 
 5  * @Title: Product.java
 6  * @Package: comm.pattern.create.builder
 7  * @Description:产品类型
 8  * @author yangzhancheng
 9  * @2020年3月25日:下午4:17:26
10  *
11  */
12 public class Product {
13 
14     //用户
15     private String name;
16 
17     //地面
18     private String floor;
19 
20     //墙面
21     private String wall;
22 
23     //厨房
24     private String kitchen;
25 
26     
27     public Product(String name){
28         this.name = name;
29     }
30 
31     public void setName(String name) {
32         this.name = name;
33     }
34     
35     public String getFloor() {
36         return floor;
37     }
38     
39     public void setFloor(String floor) {
40         this.floor = floor;
41     }
42 
43     public String getWall() {
44         return wall;
45     }
46 
47     public void setWall(String wall) {
48         this.wall = wall;
49     }
50 
51     public String getKitchen() {
52         return kitchen;
53     }
54 
55     public void setKitchen(String kitchen) {
56         this.kitchen = kitchen;
57     }
58 
59     //整体展示
60     public void display(){
61         System.out.println("这间房子的主人是:"+ this.name);
62         System.out.println("地面采用的是:"+ this.floor);
63         System.out.println("墙面设计的是:"+ this.wall);
64         System.out.println("厨房是:"+ this.kitchen);
65     }
66 }
View Code

  E.客户端(Client):

 1 package comm.pattern.create.builder;
 2 
 3 /**
 4  * 
 5  * @Title: Client.java
 6  * @Package: comm.pattern.create.builder
 7  * @Description: 描述该文件做什么
 8  * @author yangzhancheng
 9  * @2020年3月25日:下午5:03:13
10  *
11  */
12 public class Client {
13 
14     public static void main(String[] args) {
15         
16         //设计师A
17         System.out.println("A.设计师A给奥先生设计的房间:");
18         BuilderDirector director = new BuilderDirector(new BuilderA());
19         Product product = director.build();
20         product.display();
21         
22         //设计师B
23         System.out.println("-------------------------------");
24         System.out.println("设计师B给妙女士设计的房间:");
25         director = new BuilderDirector(new BuilderB());
26         product = director.build();
27         product.display();
28     }
29 
30 }
View Code

运行结果

A.设计师A给奥先生设计的房间:
这间房子的主人是:A.奥先生
地面采用的是:A.罗马式大理石。
墙面设计的是:A.文艺复兴欧式复古墙面。
厨房是:A.带有吧台的厨房,便于男主小酌一杯。
-------------------------------
设计师B给妙女士设计的房间:
这间房子的主人是:B.妙女士
地面采用的是:B.日式榻榻米风格。
墙面设计的是:B.淡雅木质构件。
厨房是:B.开放式小清新田园风格。

三、总结

    暂无,后续补充。

猜你喜欢

转载自www.cnblogs.com/fating/p/12567483.html