05.设计模式-建造者模式

简介: 建造者模式.png模式讲解:设计者(Designer)和客户(Client)沟通明确需求沟通后设计者将客户创建产品的需求划分为各个部件的建造请求(Builder)将各个部件的建造请求委派到具体的建造者(WorkBuilder)...
img_b4fccbebd89f41d31149295f65595e32.png
建造者模式.png

模式讲解:

  1. 设计者(Designer)和客户(Client)沟通明确需求
  2. 沟通后设计者将客户创建产品的需求划分为各个部件的建造请求(Builder)
  3. 将各个部件的建造请求委派到具体的建造者(WorkBuilder)
  4. 各个具体建造者负责进行产品部件的构建
  5. 最终构建成具体产品(Room)

抽象构建者

/**
 * 抽象建造者角色
 * 这是建造房子的通用功能,任何房子的构建过程都需要或者部分需要这些功能,只是具体的构建情况因房而异
 * 具体的建造者需要遵循这些建造规则,所以具体的构建者继承这个接口
 */
public interface Build {
    public void makeWindow();       
    public void makeFloor();    
    public Room getRoom();
}

具体构建者

/**
 * 具体构建者,遵从构建规则,实现定制化的建造
 * 它针对的是当前这所房子,所以持有这所房子的引用
 */
public class WorkBuilder  implements Build{
    private Room room=new Room();
    @Override
    public void makeWindow() {
        room.setWindow("窗户");
    }

    @Override
    public void makeFloor() {
        room.setFloor("地板");
    }

    @Override
    public Room getRoom() {
        return room;
    }

}

产品

/**
 * 房子类 这是要建造的产品 
 * 产品具有自己的属性,这也是建造者将要完成的工作就是给这些属性赋值
 */
public class Room {
    private String window;  
    private String floor;
    public String getWindow() {
        return window;
    }
    public void setWindow(String window) {
        this.window = window;
    }
    public String getFloor() {
        return floor;
    }
    public void setFloor(String floor) {
        this.floor = floor;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "---->floor  "+floor+"   window   "+window;
    }
    
}

设计师

/**
 * 设计师  他知道房子怎么设计
 * 他会指挥工人去建造
 * 实际生活中  大厦的设计者并不会看大厦的具体实现细节
 * 更多的是从整体角度出发,指挥这个工人团队建造
 * 所以他肯定对工人所具备的能力和行为有很深的了解
 * 换做程序代码中 ,他也肯定会持有工人 的这个对象的引用
 */
public class Designer {
    
    public void order(Build build)
    {
        build.makeFloor();
        build.makeWindow();
    }
}

开始构建

public class Client {
      public static void main(String[] args) {    
             Build worker = new WorkBuilder(); //获取工人对象   
             Designer  designer = new  Designer();   //获取设计师对象 
             designer.order(worker);    //设计师指挥工人工作
             System.out.println(worker.getRoom());;   //工人交房 
      }  
}

上边是一种标准的建造者模式,但是一般在开发中我们不会按照这种方式来构建代码,接下来进行第一次重构

第一次重构

将抽象建造者和设计师角色去掉,在具体的建造者中增加一个RoomParmas用于存储Room每个属性,上一种写法是相当于得到一个材料之后就将对应的部件构建出来,而这次我们先获取到所有的材料,等材料齐全,一次性构建出产品,所有的材料都存储在RoomParmas中

重构后的具体构建者

public class WorkBuilder{
    private RoomParmas parmas;
    
    
    public WorkBuilder( ) {
        this.parmas = new RoomParmas();
    }

    public  WorkBuilder makeWindow(String window ) {
        parmas.window=window;
        return this;
    }

    public WorkBuilder makeFloor(String floorCorlor) {
        parmas.floor=floorCorlor;
        return this;
    }
    public WorkBuilder makeDoor(String door) {
        parmas.door=door;
        return this;
    }
    /**
     *构建时把参数传递到Room中
     */
    public Room build() {
        Room room=new Room();
        room.apply(parmas);
        return room;
    }
    
    /**
     *这个内部类存储的属性和Room产品保持一致
     */
    class RoomParmas {
        public  String window;  
        public String floor;
        public String door;
    }

}

产品类

public class Room {
    private String window;  
    private String floor;
    private String doorl;
    
    @Override
    public String toString() {
        return "---->floor  "+floor+"   window   "+window;
    }
    
    /**
     * 这个方法用于接收构建者传递的参数
     * @param parmas
     */
    public void apply(RoomParmas parmas) {
        window=parmas.window;
        floor=parmas.floor;
        doorl=parmas.door;
    }
}

开始构建

public class Client {
      public static void main(String[] args) {    
             Room room=(new WorkBuilder()).makeWindow("蓝色玻璃").makeFloor("黄色地板").build(); //获取产品对象
             System.out.println(room);;   //工人交房 
      }  
}

第二次重构

我们看到,第一次重构的结果中,具体的构建者何产品类还相互独立,但是一般开发中我们为了简化代码结构,可以将具体的构建者设置到产品类中作为一个内部类来实现,可以看的出来,这种结构已经非常类似android中的AlertDialog了,这就是我们最终的结果

Room:

public class Room {
    private String window;  
    private String floor;
    private String doorl;
    
    @Override
    public String toString() {
        return "---->floor  "+floor+"   window   "+window;
    }
    
    public static class WorkBuilder{
        private RoomParmas parmas;
        
        
        public WorkBuilder( ) {
            this.parmas = new RoomParmas();
        }

        public  WorkBuilder makeWindow(String window ) {
            parmas.window=window;
            return this;
        }

        public WorkBuilder makeFloor(String floorCorlor) {
            parmas.floor=floorCorlor;
            return this;
        }
        public WorkBuilder makeDoor(String door) {
            parmas.door=door;
            return this;
        }

        public Room build() {
            Room room=new Room();
            room.apply(parmas);
            return room;
        }
        
        
        static class RoomParmas {
            public  String window;  
            public String floor;
            public String door;
        }

    }
    
    /**
     * 这个方法用于接收构建者传递的参数
     * @param parmas
     */
    public void apply(RoomParmas parmas) {
        window=parmas.window;
        floor=parmas.floor;
        doorl=parmas.door;
    }
}
相关文章
|
3月前
|
设计模式 Java 机器人
Java设计模式-建造者模式
建造者(Builder)模式指将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。它是把对象的构建和表述分离。
40 0
Java设计模式-建造者模式
|
3月前
|
设计模式
设计模式 | 建造者模式
设计模式 | 建造者模式
36 0
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——04建造者模式
Golang设计模式——04建造者模式
23 0
|
6月前
|
设计模式 算法
设计模式10 - 建造者模式【Builder Pattern】
设计模式10 - 建造者模式【Builder Pattern】
16 0
|
6月前
|
设计模式 C++
设计模式之建造者模式(C++)
设计模式之建造者模式(C++)
|
4月前
|
设计模式 Java
Java设计模式【四】:建造者模式
Java设计模式【四】:建造者模式
24 0
|
5月前
|
设计模式 缓存 Java
认真学习设计模式之建造者模式(Builder Pattern)
认真学习设计模式之建造者模式(Builder Pattern)
56 1
|
6月前
|
设计模式 缓存 Java
【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)
49 0
|
5天前
|
设计模式 Java
小谈设计模式(14)—建造者模式
小谈设计模式(14)—建造者模式
|
29天前
|
设计模式 Java
设计模式之建造者模式
设计模式之建造者模式