美文网首页
5、创建型设计模式-建造者模式

5、创建型设计模式-建造者模式

作者: 日落_3d9f | 来源:发表于2021-07-13 20:12 被阅读0次

    建造者模式(Builder Pattern)

    使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    允许用户只通过指定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节。

    场景举例:

    • KFC创建套餐:套餐是一个复杂对象,它一般包含主食如汉堡、烤翅等和饮料 如果汁、 可乐等组成部分,不同的套餐有不同的组合,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐
    建造者模式
    • 电脑有低配、高配,组装需要CPU、内存、电源、硬盘、主板等

    核心组成:

    Builder:抽象建造者,定义多个通用方法和构建方法
    ConcreteBuilder:具体建造者,可以有多个
    Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
    Product:产品角色

    建造者模式

    产品:

    public class Computer {
    
        private String cpu;
    
        private String memory;
    
        private String mainboard;
    
        private String disk;
    
        private String power;
    
    
        @Override
        public String toString() {
            return "Computer{" +
                    "cpu='" + cpu + '\'' +
                    ", memory='" + memory + '\'' +
                    ", mainboard='" + mainboard + '\'' +
                    ", disk='" + disk + '\'' +
                    ", power='" + power + '\'' +
                    '}';
        }
    
        public String getCpu() {
            return cpu;
        }
    
        public void setCpu(String cpu) {
            this.cpu = cpu;
        }
    
        public String getMemory() {
            return memory;
        }
    
        public void setMemory(String memory) {
            this.memory = memory;
        }
    
        public String getMainboard() {
            return mainboard;
        }
    
        public void setMainboard(String mainboard) {
            this.mainboard = mainboard;
        }
    
        public String getDisk() {
            return disk;
        }
    
        public void setDisk(String disk) {
            this.disk = disk;
        }
    
        public String getPower() {
            return power;
        }
    
        public void setPower(String power) {
            this.power = power;
        }
    }
    

    声明了建造者的公共方法

    /**
     * 声明了建造者的公共方法
     */
    public interface Builder {
    
        /**
         *细节方法
         */
        void buildCpu();
    
        void buildMainboard();
    
        void buildDisk();
    
        void buildPower();
    
        void buildMemory();
    
        Computer createComputer();
    }
    

    具体的建造者,实现builder来创建不同的产品-低配版

    public class LowComputerBuilder implements Builder{
    
        private Computer computer = new Computer();
    
        @Override
        public void buildCpu() {
            computer.setCpu("低配 CPU");
        }
    
        @Override
        public void buildMainboard() {
            computer.setMainboard("低配 主板");
        }
    
        @Override
        public void buildDisk() {
            computer.setDisk("低配 磁盘");
        }
    
        @Override
        public void buildPower() {
            computer.setPower("低配 电源");
        }
    
        @Override
        public void buildMemory() {
            computer.setMemory("低配 内存");
        }
    
        @Override
        public Computer createComputer() {
            return computer;
        }
    }
    

    具体的建造者,实现builder来创建不同的产品-高配版

    public class HighComputerBuilder implements Builder{
    
        private Computer computer = new Computer();
    
        @Override
        public void buildCpu() {
            computer.setCpu("高配 CPU");
        }
    
        @Override
        public void buildMainboard() {
            computer.setMainboard("高配 主板");
        }
    
        @Override
        public void buildDisk() {
            computer.setDisk("高配 磁盘");
        }
    
        @Override
        public void buildPower() {
            computer.setPower("高配 电源");
        }
    
        @Override
        public void buildMemory() {
            computer.setMemory("高配 内存");
        }
    
        @Override
        public Computer createComputer() {
            return computer;
        }
    }
    

    将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程。Director是全程指导组装过程,具体的细节还是builder去操作。

    public class Director {
        public Computer craete(Builder builder){
            builder.buildMemory();
            builder.buildCpu();
            builder.buildMainboard();
            builder.buildDisk();
            builder.buildPower();
            return builder.createComputer();
        }
    }
    

    Main函数:

    public class Main {
        public static void main(String[] args) {
            Director director = new Director();
            Computer lowComputer = director.craete(new LowComputerBuilder());
            Computer highComputer = director.craete(new HighComputerBuilder());
            System.out.println(lowComputer.toString());
            System.out.println(highComputer.toString());
    
        }
    }
    

    执行结果:

    Computer{cpu='低配 CPU', memory='低配 内存', mainboard='低配 主板', disk='低配 磁盘', power='低配 电源'}
    Computer{cpu='高配 CPU', memory='高配 内存', mainboard='高配 主板', disk='高配 磁盘', power='高配 电源'}
    

    之间执行 IDEA 启动时报 error:java 无效的源发行版11,需要修改,如下:


    IDEA 启动时报 error:java 无效的源发行版11

    解决地址链接:https://blog.csdn.net/weixin_42236404/article/details/105630665

    优点:

    • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦;
    • 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程;
    • 增加新的具体建造者无须修改原有类库的代码,符合开闭原则;
    • 建造者模式结合链式编程来使用,代码上更加美观;

    缺点:

    • 建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用

    JDK里面的应用:

    • tcp传输协议 protobuf 生成的api、java中的StringBuilder(不完全一样,思想一样)

    建造者模式与抽象工厂模式的比较:

    • 建造者模式返回一个组装好的完整产品 , 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族

    相关文章

      网友评论

          本文标题:5、创建型设计模式-建造者模式

          本文链接:https://www.haomeiwen.com/subject/qwvspltx.html