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

news/2024/4/24 22:15:57

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

概念和原理:

建造者模式(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方法...
}

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

Phone phone = new Phone.Builder()  .setBrand("小米")  .setMemory("512G")  .setPrice(2999)  .build();

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

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;
}

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

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

Phone phone = new Phone.Builder()  .setBrand("苹果")  .setMemory("512G")  .setPrice(8999)  .build();

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

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

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

三、使用注意事项

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

四、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.tangninghui.cn.cn/item-68.htm

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 1149.文章浏览2

数据准备 drop table Views; Create table If Not Exists Views (article_id int, author_id int, viewer_id int, view_date date); Truncate table Views; insert into Views (article_id, author_id, viewer_id, view_date) values (1, 3, 5, 2019-08-01); insert into Vie…

不同场景下的JMETER设置

不同场景下的JMETER设置 1.基准测试 验证主要业务在单用户运行下的性能指标,为多用户并发并发和混合场景的性能分析提供基础参考。 基准测试JMETER线程组设置(在1秒内执行5个线程循环一次): 2.并发测试 多用户在同一时间访问某一个模块或则应用的场景&…

亚马逊关于在澳大利亚销售儿童玩具和游戏的政策合规标准是什么?

亚马逊关于在澳大利亚销售儿童玩具和游戏的政策 在亚马逊澳大利亚商城中,设计用于或明确表示专供 14 岁及以下儿童玩耍用的所有商品或材料均视为儿童玩具。 商品根据以下标准确定为“儿童商品”: 预期用途: ASIN 是否可供儿童使用&#xff…

Linux下运行Jmeter压测

一、在Linux服务器先安装SDK 1、先从官网下载jdk1.8.0_131.tar.gz,再从本地上传到Linux服务器 2、解压:tar -xzf jdk1.8.0_131.tar.gz,生成文件夹 jdk1.8.0_131 3、在/usr/目录下创建java文件夹,再将 jdk1.8.0_131目录移动到/u…

LeetCode147之对链表进行插入排序(相关话题:链表)

题目描述 给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列…

对IP协议概念以及IP地址的概念进行简单整理

网络层重要协议 参考模型和协议栈IP协议IPv4数据报IP数据报格式IPv4地址特殊IP地址私有IP地址和公有IP地址子网划分 参考模型和协议栈 IP协议 IP协议定义了网络层数据传送的基本单元,也制定了一系列关于网络层的规则。 IPv4数据报 网络层的协议数据单元PDU 叫做分…