• 小谈设计模式(14)—建造者模式


    专栏介绍

    专栏地址

    link

    专栏介绍

    主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。

    建造者模式

    建造者模式是一种创建型设计模式,它可以将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
    在这里插入图片描述

    角色分类

    产品(Product)

    表示被构建的复杂对象。通常包含多个部分,如属性、方法等。

    抽象建造者(Builder)

    定义了构建产品的抽象方法,通常包括构建各个部分的方法和返回产品的方法。

    具体建造者(Concrete Builder)

    实现了抽象建造者接口,负责具体的产品构建过程。通常包含一个具体产品的实例,通过构建各个部分最终返回该产品实例。

    指挥者(Director)

    负责调用具体建造者来构建产品,它不知道具体的构建细节,只负责调用构建方法和返回产品。

    在这里插入图片描述

    核心思想

    将构建复杂对象的过程分解为多个简单的步骤,通过不同的具体建造者来实现这些步骤,最终由指挥者来调用具体建造者的方法来构建产品。这样可以使得构建过程更加灵活,可以根据需要选择不同的具体建造者来构建不同的产品。
    在这里插入图片描述

    Java程序

    // 产品类
    class Product {
        private String part1;
        private String part2;
        
        public void setPart1(String part1) {
            this.part1 = part1;
        }
        
        public void setPart2(String part2) {
            this.part2 = part2;
        }
        
        public void show() {
            System.out.println("Part 1: " + part1);
            System.out.println("Part 2: " + part2);
        }
    }
    
    // 抽象建造者
    interface Builder {
        void buildPart1();
        void buildPart2();
        Product getResult();
    }
    
    // 具体建造者
    class ConcreteBuilder implements Builder {
        private Product product;
        
        public ConcreteBuilder() {
            product = new Product();
        }
        
        public void buildPart1() {
            product.setPart1("Part 1");
        }
        
        public void buildPart2() {
            product.setPart2("Part 2");
        }
        
        public Product getResult() {
            return product;
        }
    }
    
    // 指挥者
    class Director {
        private Builder builder;
        
        public Director(Builder builder) {
            this.builder = builder;
        }
        
        public void construct() {
            builder.buildPart1();
            builder.buildPart2();
        }
    }
    
    // 客户端
    public class Client {
        public static void main(String[] args) {
            Builder builder = new ConcreteBuilder();
            Director director = new Director(builder);
            director.construct();
            Product product = builder.getResult();
            product.show();
        }
    }
    
    • 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

    程序分析

    在上述代码中,我们定义了一个产品类 Product,它有两个部分 part1 和 part2。然后我们定义了一个抽象建造者接口 Builder,其中包含了构建产品各个部分的方法,并定义了获取最终产品的方法。接着我们实现了具体建造者 ConcreteBuilder,它实现了建造者接口,并具体实现了构建各个部分的方法。然后我们定义了一个指挥者 Director,它负责控制建造过程,通过调用建造者的方法来构建产品。最后,在客户端中,我们创建了一个具体建造者对象,并将其传入指挥者中,然后通过指挥者来构建产品,并最终获取到构建好的产品并展示出来。

    在这里插入图片描述

    优缺点分析

    优点

    1

    可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

    2

    可以更加精细地控制对象的构建过程,灵活地添加、删除或修改构建步骤,从而创建不同的产品。

    3

    可以避免构造方法中出现过多的参数,提高代码的可读性和可维护性。

    4

    可以通过建造者来隐藏具体产品的实现细节,只暴露统一的构建接口,提高代码的封装性。
    在这里插入图片描述

    缺点

    1

    增加了代码的复杂性,需要定义多个类和接口来实现建造者模式。

    2

    如果产品的组成部分变化较少,或者只有一个具体建造者,建造者模式可能会显得过于繁琐。

    总结分析

    建造者模式适用于构建复杂对象的场景,通过将构建过程分解为多个步骤,使得构建过程更加灵活,并且可以复用相同的构建过程来创建不同的产品。然而,建造者模式也会增加代码的复杂性,需要权衡使用建造者模式带来的优势和缺点。

    在这里插入图片描述

  • 相关阅读:
    MySQL:07-MySQL事务
    从根上理解Cglib与JDK动态代理
    快速了解SpringBoot(SpringBoot集成Mybatis)
    Kafka/Zookeeper集群搭建
    聊聊 C++ 中的几种智能指针 (下)
    MySQL——事务隔离级别
    Docker部署SpringBoot +Vue项目流程详解(含域名 + HTTPS)
    java-多线程,使用线程池提交callable线程,阻塞获取线程的返回值
    Java编程学习知识点总结
    metinfo 6.0.0任意文件读取漏洞复现
  • 原文地址:https://blog.csdn.net/weixin_74888502/article/details/133524929