• Java设计模式之建造者模式


    1. 建造者模式

    1.1 定义、优缺点、应用场景

    在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个部件按一定的步骤组合而成。例如计算机是由CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,用户不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的用户

    定义:将一个复杂对象的定义和构造分离,使同样的构建过程可以创建不同的产品,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。产品的组成部分是不变的,但每一部分可以灵活选择

    优点

    • 封装性好,产品的定义和产品的构建相分离
    • 扩展性好,各个具体的建造者相互独立,有利于系统的解耦
    • 客户端不必知道产品内部组成的细节,建造者创建不同的部件是相互独立的,对其它部件不会产生影响

    缺点

    • 产品的组成部分必须相同,这限制了其使用范围
    • 如果产品的内部变化复杂,则建造者也要同步修改,后期维护成本较大

    建造者模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,两者可以结合使用

    应用场景

    • 相同的方法,不同的执行顺序,产生不同的结果
    • 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同
    • 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用
    • 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值

    1.2 模式的结构与实现

    结构

    • 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件
    • 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法getResult
    • 具体建造者(Concrete Builder):实现Builder接口,完成复杂产品的各个部件的具体创建方法
    • 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息

    实现

    public class Java11Test {
    
        public static void main(String[] args) {
    
            // 可以通过配置文件进行类名的配置,然后实例化对应的具体建造者
            Engineer engineer = new ConcreteEngineer1();
            Company company = new Company(engineer);
            Computer computer = company.construct();
            computer.show();
    
        }
    }
    
    
    // 产品角色:计算机
    class Computer {
        private String memory;
        private String disk;
    
        public void setMemory(String memory) {
            this.memory = memory;
        }
    
        public void setDisk(String disk) {
            this.disk = disk;
        }
    
        public void show() {
            System.out.println("生产的电脑配置---内存:" + memory + ", 磁盘:" + disk);
        }
    }
    
    // 抽象建造者:技术人员
    abstract class Engineer {
    
        // 创建一台电脑
        protected Computer computer = new Computer();
    
        // 对电脑进行组装
        public abstract void buildMemory();
    
        public abstract void buildDisk();
    
        // 返回一台电脑
        public Computer getComputer() {
            return computer;
        }
    }
    
    // 具体建造者:技术人员1
    class ConcreteEngineer1 extends Engineer {
        public void buildMemory() {
            computer.setMemory("金士顿");
        }
    
        public void buildDisk() {
            computer.setDisk("西部数据");
        }
    }
    
    // 指挥者
    class Company {
        private Engineer engineer;
    
        public Company(Engineer engineer) {
            this.engineer = engineer;
        }
    
        // 进行电脑的组装
        public Computer construct() {
            engineer.buildMemory();
            engineer.buildDisk();
    
            return engineer.getComputer();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    执行程序,结果如下:

    生产的电脑配置---内存:金士顿, 磁盘:西部数据
    
    • 1
  • 相关阅读:
    树的应用 —— 二叉树:二叉树的性质
    26.XML
    WebGPU 入门:绘制一个三角形
    知识付费平台开发技术实践:构建数字学习的未来
    基于JAVA养老智慧服务平台计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    学会这款自动化测试神器,不会写代码也能做!
    【Axure高保真原型】桥梁监控大屏可视化案例
    SpringMvc第六战-【SpringMvcJSON返回&异常处理机制】
    【ArcGIS Pro二次开发】(65):进出平衡SHP转TXT、TXT转SHP
    allegro中shape的一些基本操作(二)——铜皮添加网络、合并shape
  • 原文地址:https://blog.csdn.net/yy8623977/article/details/125663843