• Java设计模式之建造者模式详解(Builder Pattern)


    在日常的开发工作中,我们常常需要创建一些复杂的对象。这些对象可能包含许多不同的属性,并且这些属性的初始化过程可能相当复杂。在这种情况下,建造者模式是一种非常有用的设计模式,因为它允许我们分步骤地创建复杂的对象。

    概念和原理:

    建造者模式(Builder Pattern)是一种创建型设计模式,它用于构建复杂的对象。这种模式通常用于构建具有许多属性的对象,并且允许用户通过使用一组流畅的API逐个设置这些属性,而不是通过使用大量的构造函数参数去设置。

    它的工作原理就是将复杂对象的构建与其表示分离。这说明我们可以使用一个建造者对象来创建和配置一个复杂的对象,而不需要了解这个复杂对象的内部工作原理。这样可以使代码更加灵活,更容易维护和扩展。

    一、代码示例

    1.1 普通使用

    我们先定义一个“手机”类,这个对象有许多属性,比如品牌、内存、价格等… 并且每个属性对对象的构建过程都有特定的要求。我们可以使用建造者模式来逐步构建和配置这个对象。

    public class Phone {
        // 品牌
        private String brand;
        // 内存
        private String memory;
        // 价格
        private int price;
    
        private Phone(Builder builder) {
            this.brand= builder.brand;
            this.memory = builder.memory;
            this.price= builder.price;
        }
    
        public static class Builder {
            private String brand;
        	private String memory;
        	private int price;
    
            public Builder setBrand(String brand) {
                this.brand= brand;
                return this; // 返回当前对象,以便进行链式调用
            }
            
    		public Builder setMemory(String memory) {
                if (memory!= null && !memory.isEmpty()) { // 验证memory是否有效
                    this.memory= memory;
                } else {
                    throw new IllegalArgumentException("Invalid memory specification");
                }
                return this;
            }
    
            public Builder setPrice(int price) {
                if (price> 0) { // 验证price是否有效
                    this.price= price;
                } else {
                    throw new IllegalArgumentException("price must be greater than 0");
                }
                return this;
            }
            
            public Phone build() {
                return new Phone(this);
            }
        }
    
        // 省略getter和setter方法...
    }
    
    • 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

    现在,我们可以使用建造者模式来创建“手机”对象:

    Phone phone = new Phone.Builder()  
                            .setBrand("小米")  
                            .setMemory("512G")  
                            .setPrice(2999)  
                            .build();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这样,我们就可以通过链式调用的方式逐步设置和构建“电脑”对象,并验证每个属性的有效性。此外,通过将构建过程封装在建造者类中,我们可以更加灵活地改变对象的创建过程,而不需要去修改表示的代码。

    1.2 使用lombok

    这就不得不请出我们java开发的必备神器了哈哈,Lombok是一个Java库,它可以通过注解自动创建getter、setter、equals、hashCode和toString方法,从而减少模板代码的数量。Lombok也可以与建造者模式可以一起使用,以进一步简化代码:

    import lombok.Builder;  
    import lombok.Data;  
      
    @Data  
    @Builder  
    public class Phone {
        private String brand;
        private String memory;
        private int price;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我们使用了Lombok的@Data注解来自动生成getter、setter等方法。@Builder注解告诉Lombok生成一个建造者类,该类具有与Phone类相同的属性,并提供链式调用的方法来设置这些属性。

    然后我们可以和前面一样创建“手机”对象:

    Phone phone = new Phone.Builder()  
                            .setBrand("苹果")  
                            .setMemory("512G")  
                            .setPrice(8999)  
                            .build();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    因为@Builder注解会自动为Phone类生成一个名为PhoneBuilder的静态内部类,该类具有与原始类相同的属性,并且每个属性都有一个返回此构建器的方法。所以这使得我们可以使用链式调用方式来设置属性并构建对象。

    二、使用建造者模式的好处

    • 链式调用: 建造者模式允许我们通过链式调用的方式来设置对象的属性,这使得代码更加清晰和易于阅读。
    • 易于维护: 如果对象具有很多属性,并且这些属性的初始化过程很复杂,那么使用建造者模式可以使得代码更加模块化,更容易理解和维护。
    • 分离对象构造和表示: 建造者模式将对象的构造和表示分离开来,使得我们可以灵活地改变对象的创建过程,而不需要去修改表示的代码。

    三、使用注意事项

    • 对于简单的对象,使用建造者模式可能会过度复杂化代码,所以在决定是否使用建造者模式时,需要权衡利弊。
    • 需要注意避免在建造者模式中产生不必要的代码重复。比如,如果不同的方法需要使用相同的属性,那么应该避免在每个方法中都重复创建相同的属性。

    四、总结

    建造者模式是一种非常有用的设计模式,尤其适用于创建具有很多属性的复杂对象。通过链式调用的方式来设置对象的属性,使得代码更加清晰和易于阅读。同时,将对象的构造和表示分离开来,使得我们可以灵活地改变对象的创建过程。然而,对于简单的对象,使用建造者模式可能会过度复杂化代码,因此在使用时需要权衡利弊。总的来说,掌握好建造者模式,可以让我们的代码更加清晰、易于维护和理解,快使用起来吧 ~

  • 相关阅读:
    HTML笔记
    Springboot毕设项目办公用品管理系统c1139(java+VUE+Mybatis+Maven+Mysql)
    元宇宙+NFT是“宝”还是“炒”
    疫情之下,普通人高薪就业指南:学软件测试,路就不会遥远
    【培训课程专用】中断路由代码导读:当cpu运行在TEE来了一个Non secure Group1中断
    numpy和matlab的多维数组展平:ravel, flatten, reshape, (:)
    决策树深度探索: 从基础构建到机器学习应用
    揭秘!新手主播如何快速出圈,看拓世法宝分分钟打造百万直播间
    从技术角度探索安卓群控实现的基本思路
    以业务为核心,泛微协助生产制造企业推动销售到生产一体化管理
  • 原文地址:https://blog.csdn.net/weixin_47390965/article/details/132773725