【读书笔记】《Effective Java》第二章 第2条:遇到多个构造器参数时要考虑使用Builder

一、前言《Effective Java》读书笔记系列第二章 第1条:创建和销毁对象二、介绍我们开发中偶尔会遇到一些需要设置10个或以上大量参数的情况,通常情况有几种处理方式:多构造函数、setter、Builder模式。1、多构造函数:这种方式虽然最方便,但也最繁琐,假设有一个方法需要设置6个int型的参数,但多数情况下,这6个中总有你不想传的参数,但这时候就需要约定一个规则:例如传0,但是传0又会有一个问题就是传入顺序问题,传入顺序不同并不会导致程序编译不通过,却会导致程序运行结果不正确。所
摘要由CSDN通过智能技术生成

一、前言

《Effective Java》读书笔记系列
第二章 第1条:创建和销毁对象
第二章 第2条:遇到多个构造器参数时要考虑使用Builder


二、介绍

我们开发中偶尔会遇到一些需要设置10个或以上大量参数的情况,通常情况有几种处理方式:多构造函数、setterBuilder模式

  • 1、多构造函数:这种方式虽然最方便,但也最繁琐,假设有一个方法需要设置6int型的参数,但多数情况下,这6个中总有你不想传的参数,这时候就需要约定一个规则:例如传0,但是传0又会有一个问题就是传入顺序问题,传入顺序不同并不会导致程序编译不通过,却会导致程序运行结果不正确。所以这并不是一种好方式
  • 2、setter
    虽然它可以解决多构造带来的传入顺序问题,但是它还是略显繁琐了。所以我们通常只会在JavaBean中使用setter
  • 3、Builder模式
  • 本文要介绍的一种方式,可以完美解决上述两种方式带来的弊端,让代码更加符合设计模式。参考GlideRetrofit的使用方式,它们都是通过链式调用一个一个参数连接起来的



三、定义

Builder的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示



四、使用场景

主要强调两点:调用顺序多参数

  • 1、相同的方法,不同的执行顺序,需要产生不同的事件结果时
  • 2、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同的时候
  • 3、产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用时
  • 4、当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时



四、UML图

Builder

背景:我要建造一个xsic
在这个背景下,Productxsic的抽象,也就是人,ConcreteBuilder是一个具体Builder类,继承了抽象BuilderBuilder,而Director可以是一个高层客户端模块,也可以是一个为高层客户端模块提供构建功能的中间模块



四、举例

1、抽象产品类,在UML中没有具体体现

	public abstract class Person {
   
	    protected String mHead;
	    protected int mBody;
	    protected String mArm;
	    protected String mLeg;
	    protected String mHair;
	
	    public abstract void setHead(String head);
	
	
	    public abstract void setBody(int body);
	
	    public void setmArm(String mArm) {
   
	        this.mArm = mArm;
	    }
	
	    public void setmLeg(String mLeg) {
   
	        this.mLeg = mLeg;
	    }
	
	    public void setmHair(String mHair) {
   
	        this.mHair = mHair * mBody;
	    }
	}

2、具体产品类,对应UML中的Product

	public class Xsic extends Person {
   
	
	    public Xsic() {
   
	    }
	
	    @Override
	    public void setHead(String head) {
   
	        mHead = "默认头";
	    }
	
	    @Override
	    public void setBody(int body) {
   
	        mBody = 1;
	    }
	}

3、抽象Builder类,对应UML中的Builder

	public abstract class Builder {
   
	    public abstract Builder buildHead(String head);
	    public abstract Builder buildBody(int body);
	    public abstract Builder buildArm(String arm);
	    public abstract Builder buildLeg(String leg);
	    public abstract Builder buildHair(String hair);
	    public abstract Person build();
	}

4、具体Builder类,对应UML中的ConcreteBuilder

	public class XsicBuilder extends Builder {
   
	    private Xsic xsic = new Xsic();
	
	    @Override
	    public Builder buildHead(String head) {
   
	        xsic.setHead(head);
	        return this;
	    }
	
	    @Override
	    public Builder buildBody(int body) {
   
	        xsic.setBody(body);
	        return this;
	    }
	
	    @Override
	    public Builder buildArm(String arm) {
   
	        xsic.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值