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;
    }
}
相关文章
|
6月前
|
设计模式 Java
【设计模式系列笔记】建造者模式
建造者模式是一种创建型设计模式,用于将复杂对象的构建与其表示分离,使构建过程可定制。关键元素包括产品类(定义要构建的对象)、建造者接口(定义构建方法)、具体建造者类(实现构建过程)和指导者类(负责构建过程)。通过建造者模式,客户端可以灵活地创建具有不同表示的复杂对象,提高代码的可读性和可维护性,尤其适用于构建过程复杂且包含多个可选部分的情况。
131 1
|
6月前
|
设计模式 安全 Java
构建未来应用:Java设计模式 - 建造者模式(Builder)在现代编程中的应用
【4月更文挑战第7天】建造者模式是提升代码质量的关键,尤其在复杂环境中。它分步骤构建对象,将构建与表示分离,适用于UI构建、数据模型组装、配置文件解析和网络请求构造等场景。最佳实践包括明确构建步骤、提供默认值、支持链式调用和确保线程安全。然而,过多步骤、不一致状态和性能问题是使用时需注意的问题。掌握建造者模式对于现代编程至关重要。
84 3
|
2月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
2月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
3月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
5月前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
|
6月前
|
设计模式 uml
大话设计模式(3)——造物者一般的建造者模式
大话设计模式(3)——造物者一般的建造者模式
39 1
大话设计模式(3)——造物者一般的建造者模式
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
45 0
|
5月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
5月前
|
设计模式 Java
Java设计模式:建造者模式之经典与流式的三种实现(四)
Java设计模式:建造者模式之经典与流式的三种实现(四)