构造器模式(Builder模式)
文章目录
- 目的
- 传统实现方式
- 构造器模式(Builder模式)
目的
当我们想要创建一个实体的时候,如果该实体中有大量的参数可以根据需求选择是否传入。
传统实现方式
通常我们有两种方式去实现:
- 重叠构造器
重叠构造器的场景很常见,通常我们会按照需求不断重载构造方法,提供不同的参数。
这样的方式当参数多起来的时候,会变得很难阅读,且十分容易发生传入错误的情况,同时还会存在同类型参数只能有一个存在的情况(如只传入作者的话,就无法重载只传入ISBN或只传入分类的情况)。
Demo:
public class Book {/*** 书名和价格为必需,其他内容为可选*/private String name; //书名private float price; //价格private String author; //作者private String ISBN; //ISBNprivate String type; //分类public Book(String name, float price) {this.name = name;this.price = price;}public Book(String name, float price, String author) {this.name = name;this.price = price;this.author = author;}public Book(String name, float price, String author, String ISBN) {this.name = name;this.price = price;this.author = author;this.ISBN = ISBN;}
}
- JavaBean
使用JavaBean的方式,通过Bean中的get和set方式,创建出的实例会很整洁,读起来也比较容易。
public class Book {/*** 书名和价格为必需,其他内容为可选*/private String name; //书名private float price; //价格private String author; //作者private String ISBN; //ISBNprivate String type; //分类public String getName() {return name;}public void setName(String name) {this.name = name;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getISBN() {return ISBN;}public void setISBN(String ISBN) {this.ISBN = ISBN;}public String getType() {return type;}public void setType(String type) {this.type = type;}
}
Book book = new Book();
book.setName("Hello World");
book.setPrice(100.00f);
book.setAuthor("Coder");
book.setISBN("123465789");
book.setType("technology");
这种方式存在一个问题:构造的过程被分配到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。(具体见“Effective Java”第二章第2条)。
构造器模式(Builder模式)
通过构造器模式,既可以保证安全性,又有了良好的可读性,使用时仅需按需调用即可。
package com.example.buildermodel;/*** @author: SuHang* @date: 2021/9/2* @desc:*/
public class Book {/*** 书名和价格为必需,其他内容为可选*/private final String name; //书名private final float price; //价格private final String author; //作者private final String isbn; //isbnprivate final String type; //分类//创建构造器public static class Builder {//必须传入的参数,即书名和价格private final String name; //书名private final float price; //价格//可选传入的参数 --- 初始化默认值private String author = "Author"; //作者private String isbn = "isbn"; //isbnprivate String type = "TYPE"; //分类//提供创建实例的构造方法,确保传入必传项。public Builder(String name, float price) {this.name = name;this.price = price;}//提供可选参数。public Builder author(String author) {this.author = author;return this;}public Builder isbn(String isbn) {this.isbn = isbn;return this;}public Builder type(String type) {this.type = type;return this;}//最终创建Book的方法public Book build() {return new Book(this);}}private Book(Builder builder) {name = builder.name;price = builder.price;author = builder.author;isbn = builder.isbn;type = builder.type;}
}
Book book = new Book.Builder("Hello World", 100.00f).author("Coder").isbn("123456789").type("technology").build();
构造器模式(Builder模式)相关推荐
- 一些实用的编程模式 | Builder模式能用来解决什么问题?
建造模式,也有翻译成生成器模式的,大家看到后知道他们是一个东西,都是Builer Pattern翻译过来的就行.它是一种对象构建模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不 ...
- 建造者模式与原型模式/builder模式与prototype模式/创建型模式
建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...
- 火遍全网的Hutool,如何使用Builder模式构建线程池
前言 Builder 设计模式也叫做 构建者模式或者建造者模式,名字只是一种叫法,当聊起三种名称的时候知道是怎么回事就行 Builder 设计模式在作者编码过程中,属于比较常用的模式之一.优秀的设计模 ...
- Effective Java:Builder模式
在Java中遇到多个参数时,有3种方式可以构造类. 一.重叠构造器(telescoping constructor)模式 这种模式下,在类中有多个使用不同参数的构造函数,需要什么参数,就写一个相应的构 ...
- Builder模式简单理解
Builder 模式 Builder模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 那么Builder模式的用场景呢? (1) 相同的方法,不同的执行顺序,产生不同的 ...
- Android常用设计模式之Builder模式理解
Android常用设计模式之Builder模式 1 单例模式 2 Builder模式 Builder模式的应用场景 总结 1 单例模式 单例模式之前有详细的介绍,可移步到链接: 常见的单例模式及其特点 ...
- effective java 3th item2:考虑 builder 模式,当构造器参数过多的时候
yiaz 读书笔记,翻译于 effective java 3th 英文版,可能有些地方有错误.欢迎指正. 静态工厂方法和构造器都有一个限制:当有许多参数的时候,它们不能很好的扩展. 比如试想下如下场景 ...
- 同事写了一个疯狂的类构造器,我要疯了,Builder 模式都不会么?!!
疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...
- java的设计模式 - Builder模式
Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...
- java设计模式建造_Java设计模式——建造模式(Builder Pattern)
Builder模式常用例子 今天就简单粗暴的介绍一下Builder模式概念和使用. Dialog的创建 AlertDialog dialog = new AlertDialog.Builder(thi ...
最新文章
- React 项目中使用Echarts
- React Native之箭头函数和延展操作符(...)
- GDCM:Patch File的测试程序
- IP地址分类及CIDR划分方法
- 编程中的移位运算符简单解释
- Ehlib 单元格 图像绘制 代码
- 仿souhu页面设计
- 韩顺平 java笔记 第8讲 this 类变量 第9讲 类方法
- 408考研计算机网络视频,计算机408考研视频哪个好
- dnsmasq, ipset和iptables配置
- 网络流量监测IP雷达 1.0
- 计算机机房系统建设,计算机机房系统建设方案(范文).pdf
- 【核心命令 cd pwd mkdir touch ls mv cp echo vim rm】
- 8. 无线体内纳米网:基于蓝牙LE接口的数字ID系统
- d盘莫名其妙被占空间 win10_Win10系统C盘空间突然爆满的解决方法
- 期望风险最小化、经验风险最小化、结构风险最小化
- 在studio one中使用iZotope Ozone 9?臭氧9怎么导入到Logic Pro X和AU中?速看教程
- 什么是Alpha和Beta测试?
- 台湾 天堂java 论坛_tiantangsifu_Rev1388jar_1386db java编写天堂私服*系统 - 下载 - 搜珍网...
- Python_Task09:文件与文件系统
热门文章
- C#调用Qpdf的界面+拖拽pdf文件到窗口+解除pdf权限密码+另存为
- Acer EC-471G BIOS升级注意事项
- 项目管理--maven浅析《四》之私服(Nexus)
- 计算机等级考试攻略:四级网络工程师
- font: 0.5rem/1 tahoma, arial, 'Microsoft YaHei', simsun;
- 有效解决鼠标问题的驱动工具-罗技G502游戏鼠标驱动程序提供下载
- c语言12个实验报告,C语言实验报告合集
- xmpp 即时通讯协议研究
- 加载行为:未加载用户已选择禁用宏
- 〖Python 数据库开发实战 - MySQL篇⑤〗- 为大家推荐几款经典的数据库可视化工具