Effective Java:Builder模式
在Java中遇到多个参数时,有3种方式可以构造类。
一、重叠构造器(telescoping constructor)模式
这种模式下,在类中有多个使用不同参数的构造函数,需要什么参数,就写一个相应的构造函数。结果是随着参数数目的增加,代码臃肿不堪。
二、JavaBean模式
这种模式下,通过调用一个无参构造函数来创建对象,然后通过setter方法来设置必要的参数。这种代码创建实例很容易,读起来也不费力,但是它将构造过程分到了很多setter调用中,设置参数的时候,JavaBean可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性保证一致性。
三、Builder模式
Builder模式像个构造器一样,它的setter方法返回builder本身,以便可以把调用链接起来。安卓里面AlertDialog就是通过Builder模式来初始化的。下面是Effective Java书中的一个例子,在此作了部分修改和简化,其中Builder类通过书中提到的泛型来实现。
public class NutritionFacts {private final int size;private final int fat;private final int sodium;private final int calories;private NutritionFacts(Builder builder) {this.size = builder.size;this.fat = builder.fat;this.sodium = builder.sodium;this.calories = builder.calories;}public int getSize() {return size;}public int getFat() {return fat;}public int getSodium() {return sodium;}public int getCalories() {return calories;}public static class Builder implements BuilderInterface<NutritionFacts> {// Required parametersprivate final int size;private final int fat;// Optional parameters - initialized to default valuesprivate int sodium = 0;private int calories = 0;public Builder setSodium(int sodium) {this.sodium = sodium;return this;}public Builder setCalories(int calories) {this.calories = calories;return this;}public Builder(int size, int fat) {this.size = size;this.fat = fat;}@Overridepublic NutritionFacts build() {return new NutritionFacts(this);}}
}
BuilderInterface接口如下所示:
public interface BuilderInterface<T> {T build();
}
这样,新建一个NutritionFacts对象,只需要使用下面的代码:
NutritionFacts cocaCola = new NutritionFacts.Builder(1,2).setSodium(3).setCalories(4).build();
在此需要注意的地方有:
1. 初始化必须使用的变量使用final修饰,是为了防止变量发生变化,只允许初始化设值。
2. NutritionFacts的构造函数使用private修饰,即只允许通过Builder来实例化对象。
总结
简而言之,如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是种不错的选择,特别是当大多数参数都是可选的时候。与使用传统的重叠构造器模式相比,使用Builder模式的客户端代码将更易于阅读和编写,构建器也比JavaBean更加安全。
Effective Java:Builder模式相关推荐
- JAVA Builder模式构建MAP/LIST的示例
我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...
- Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式
Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式 一.概述 模板设计模式: 父类定义通用抽象的功能方法,子类负责具体的实现. 本文将以一个通 ...
- effective java 3th item2:考虑 builder 模式,当构造器参数过多的时候
yiaz 读书笔记,翻译于 effective java 3th 英文版,可能有些地方有错误.欢迎指正. 静态工厂方法和构造器都有一个限制:当有许多参数的时候,它们不能很好的扩展. 比如试想下如下场景 ...
- effective java之 builder模式
在java开发中我们经常需要创建对象 ,我们常用的创建对象的方法有两种 1 使用构造器来创建对象 如果有多个可变参数 ,就需要写多个构造方法,这种方法在遇到多个参数时不好控制 2. javabea ...
- java的设计模式 - Builder模式
Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...
- Effective Java(一)———— 代替构造器和Setter的构建器模式
引言 Java语言中的一部经典著作<Effective Java>,里面涵盖了78条我们应该熟练的Java编程技巧. 本篇博客是该书学习的系列笔记第一篇.本系列博客不会与书中的78条建议完 ...
- Java 高效编程之 Builder 模式
前言 在<Effective Java 第2版>中有提到,遇到多个构造器参数时要考虑使用构建器(Builder模式).相比于重叠构造器(telescoping constructor)模式 ...
- 【读书笔记】《Effective Java》第二章 第2条:遇到多个构造器参数时要考虑使用Builder
一.前言 <Effective Java>读书笔记系列 第二章 第1条:创建和销毁对象 第二章 第2条:遇到多个构造器参数时要考虑使用Builder 二.介绍 我们开发中偶尔会遇到一些需要 ...
- Java高效编程之Builder模式
前言 在<Effective Java 第2版>中有提到,遇到多个构造器参数时要考虑使用构建器(Builder模式).相比于重叠构造器(telescoping constructor)模式 ...
最新文章
- ORB-SLAM2从理论到代码实现(七):Tracking.cc程序详解(中)
- 微信小程序---导航(navigator)
- 一次搞定:分布式缓存 Redis 集群搭建!
- URL(统一资源定位符)
- 代码实现两个数交换方法
- TS对象中的实例属性和静态属性
- jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式
- 【C/C++】顺序容器list和vector
- qt4--qt5引用头文件区别
- Atitit lucence es solr的各种query 与sql运算符的对比 目录 1.1. 等于运算 TermQuery	1 1.2. 范围运算	1 1.3. 大小运算	1 1.4. Wi
- 华为薪酬体系的整体框架
- 图书馆借阅系统(应用)的设计与实现
- Easyui三级目录菜单+手风琴+spring mvc
- PHPCMS 前台模板集合
- MySQLyog的使用
- 离散型随机变量及其分布
- SwipeRefreshLayout极其简单的下拉刷新工具
- gmail发邮件一直失败,解决办法
- 使用LVM动态管理4T以上硬盘
- ios 往 Library的cache目录下 存放缓存数据的方法
热门文章
- 日语蔬菜水果相关词汇(1)
- 系统项目验收测试报告怎么做,2021最新测试报告收费情况
- matlab修改图像分辨率_matlab – 增加灰度图像的分辨率
- 【自考必看】《信息资源管理基础》信息资源管理基础,第1章,速通指南
- Task3 特征工程
- 安装Selenium2Library步骤以及加载Selenium2Library时为红色
- [Linux入门系列].1.2.VMWare WorkStation和VMPlayer的安装
- 触宝纽交所上市:十年磨一剑 要打造世界一流AI公司
- ubuntu18安装office2010
- 四个步骤实现在ESRI ArcMap中加载17.6G离线卫星地图的方法