当遇到构造器有多个参数时,考虑使用构建器

2024-02-06 02:48

本文主要是介绍当遇到构造器有多个参数时,考虑使用构建器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

重叠构造器

静态工厂方法和构造器都有一个共同的局限:它们都不能很好地扩展到大量的可选参数。此时一个不错的方案就是重叠构造器模式,此模式的机制原理是:创建第一个构造方法包含必须参数,第二个构造器方法包含一个可选参数,第三个包含两个可选参数,以此类推最后一个构造器包含所有的可选参数。
但是呢,重叠构造器模式虽然可行,但是但遇到大量可选参数时,客户端代码会很难写,而且比较难以阅读。如果API文档缺乏对各参数的描述,客户端代码会很容易因为参数顺序不对而出现意想不到的结果。
代码展示:

package com.stone.designpattern.builder;/*** @author Stone Wang* 重叠构造器的代码展示**/
public class Person {private String name;private String phone;private short age = 0;private String address = "";private String email = "";public Person(final String name, final String phone) {this(name, phone, (short)0);}public Person(final String name, final String phone, short age) {this(name, phone, age, "");}public Person(final String name, final String phone, short age,final String address) {this(name, phone, age, address, "");}public Person(final String name, final String phone, short age,final String address, final String email) {this.name = name;this.phone = phone;this.age = age;this.address = address;this.email = email;}public String getName() {return name;}public String getPhone() {return phone;}public short getAge() {return age;}public String getAddress() {return address;}public String getEmail() {return email;}
}

JavaBean模式

鉴于重叠构造器造成客户端代码可读性不好的局限,引入Java bean模式。此模式会提供一个带有所有必要参数的构造器和一系列的setter方法,客户端调用最小参数构造器生成类的实例,然后调用setter方法设置可选参数。
代码展示:

package com.stone.designpattern.builder;/*** @author Stone Wang* JavaBean模式的代码展示**/
public class PersonJavaBean {private String name;private String phone;private short age = 0;private String address = "";private String email = "";public PersonJavaBean(final String name, final String phone) {this.name = name;this.phone = phone;}public String getName() {return name;}public String getPhone() {return phone;}public short getAge() {return age;}public String getAddress() {return address;}public String getEmail() {return email;}public void setName(final String name) {this.name = name;}public void setPhone(final String phone) {this.phone = phone;}public void setAge(short age) {this.age = age;}public void setAddress(final String address) {this.address = address;}public void setEmail(final String email) {this.email = email;}
}

此模式在多线程的情况下会导致对象状态不一致的线程安全问题, 而且还破坏了JavaBean对象不可变的特性。

构建器

鉴于重叠构造器和JavaBean的局限,引入构构建器模式。
它不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂方法), 得到一个builder对象,然后客户端在builder对象上调用类似setter 方法来设置可选参数。

代码展示:

package com.stone.designpattern.builder;/*** @author Stone Wang* 构建器模式的代码展示**/
public class PersonBuilder {private String name;private String phone;private short age = 0;private String address = "";private String email = "";public PersonBuilder(Builder builder) {this.name = builder.name;this.phone = builder.phone;this.age = builder.age;this.address = builder.address;this.email = builder.email;}public String getName() {return name;}public String getPhone() {return phone;}public short getAge() {return age;}public String getAddress() {return address;}public String getEmail() {return email;}public static class Builder{private String name;private String phone;private short age = 0;private String address = "";private String email = "";public Builder(final String name, final String phone) {this.name = name;this.phone = phone;}public Builder setAge(short age) {this.age = age;return this;}public Builder setAddress(final String address) {this.address = address;return this;}public Builder setEmail(final String email) {this.email = email;return this;}public PersonBuilder build() {return new PersonBuilder(this);}}
}

客户端代码

package com.stone.designpattern.builder;/*** @author Stone Wang*客户端代码展示*/
public class Main {public static void main(String[] args) {// 重叠构造器的客户端Person p = new Person("Stone", "1888886688", (short)18);// JavaBean模式的客户端PersonJavaBean personJavaBean = new PersonJavaBean("Stone", "1888886688");personJavaBean.setAge((short)18);//构建器的客户端代码PersonBuilder.Builder builder = new PersonBuilder.Builder("Stone", "1888886688");PersonBuilder pb = builder.setAge((short)18).setAddress("Shanghai").build();}}

这篇关于当遇到构造器有多个参数时,考虑使用构建器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/682933

相关文章

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr