设计模式之建造者模式

1.建造者模式概念

  • 建造者模式(builder Pattern)
    • 使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
    • 允许用户只通过制定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节
  • 核心组成
    • Builder:抽象建造者,定义多个通用方法和构建方法
    • ConcreteBuilder:具体建造者,可以有多个
    • Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
    • Product:产品角色

2.代码编写

  • 代码示例,以组装电脑为例子

    java 复制代码
    /**
     * 具体产品
     */
    class Computer {
        private String cpu;
        private String memory;
    
        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;
        }
    
        @Override
        public String toString() {
            return "Computer{" +
                    "cpu='" + cpu + '\'' +
                    ", memory='" + memory + '\'' +
                    '}';
        }
    }
    
    /**
     * 声明了建造者的公共方法
     */
    interface Builder {
        void buildCpu();
    
        void buildMemory();
    
        Computer createComputer();
    }
    
    /**
     * 具体的建造者,实现builder来创建不同的产品
     * 低配电脑
     */
    class LowComputerBuilder implements Builder {
    
        private Computer computer = new Computer();
    
        @Override
        public void buildCpu() {
            computer.setCpu("低配 CPU");
        }
    
        @Override
        public void buildMemory() {
            computer.setMemory("低配 内存");
        }
    
        @Override
        public Computer createComputer() {
            return computer;
        }
    }
    
    /**
     * 具体的建造者,实现builder来创建不同的产品
     * 高配电脑
     */
    class HighComputerBuilder implements Builder {
    
        private Computer computer = new Computer();
    
        @Override
        public void buildCpu() {
            computer.setCpu("高配 CPU");
        }
    
        @Override
        public void buildMemory() {
            computer.setMemory("高配 内存");
        }
    
        @Override
        public Computer createComputer() {
            return computer;
        }
    }
    
    /**
     * 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程
     * Director是全程指导组装过程,具体的细节还是builder去操作
     */
    class Director {
        public Computer build(Builder builder) {
            builder.buildCpu();
            builder.buildMemory();
            return builder.createComputer();
        }
    }
    
    public class Main {
        public static void main(String[] args) throws CloneNotSupportedException {
            Director director = new Director();
            Computer lowComputer = director.build(new LowComputerBuilder());
            Computer highComputer = director.build(new HighComputerBuilder());
            System.out.println(lowComputer);
            System.out.println(highComputer);
        }
    }
  • 优点

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

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

    • 建造者模式返回一个组装好的完整产品
    • 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族
相关推荐
ThetaarSofVenice12 分钟前
【Java从入门到放弃 之 final 关键字】
java·开发语言·python
赔罪21 分钟前
Java 内部类与异常类
java·开发语言·intellij-idea·myeclipse
凌寒ᨐ舞26 分钟前
idea 运行 docker-compose 文件问题
java·docker·intellij-idea
静心观复33 分钟前
Java NIO、AIO分析
java·开发语言·nio
静心观复33 分钟前
java IO 与 BIO、NIO、AIO
java·nio
袁庭新35 分钟前
什么是Lua协同程序?和线程有什么区别?
java·开发语言·lua·脚本语言·袁庭新·什么是lua协同程序·lua协同程序
程序员小杰@36 分钟前
Java的 BIO、NIO、AIO?分别的作用和用法
java·python·nio
一丝晨光37 分钟前
如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?
java·c++·python·visual studio·unicode·ansi·utf8
JINGWHALE11 小时前
设计模式 行为型 策略模式(Strategy Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·设计模式·性能优化·系统架构·策略模式
喜欢小苹果的码农1 小时前
javaCV音频剪切
java·音视频