我们在工作中写代码会遇到一种情况,要给对象属性赋值,通常方式有两种:

方式1. Animal animal=new Animal("3岁",20kg,"牛奶");   使用构造方法来进行赋值。方式2. Animal animal=new Animal(); 调用对象.set方法赋值。animal.setAge("3岁");animal.setWeight("20kg");animal.setFood("牛奶");

在某些场景下,是会有一些弊端:

第一种方式: 相当于在构造函数里传递参数,但这样加入参数的时候,不能明确的知道往这个对象里加入了什么属性的内容。

假如有一个类,类里面有几十个参数属性,如果通过构造函数来赋值:

①看起来费劲

②不能清楚知道这些参数代表了什么含义

第二种方式:  对象.set函数名设置值,但是这种写法,略显冗余。

假如有几十个参数:

①冗余 ,要一个一个的设置,还不能连着写。

②费劲

使用构造者模式,不用构造方法赋值,也不用对象.set方法赋值。

在设计模式中有构造者模式(builder),在类的构造器或静态工厂具有多个参数。设计这种类时,builder模式就是个不错的选择。

Demo代码如下:

具体构造者的思路:

public class Purchase {           外部类,下面是属性。外部类的属性与内部类的属性完全一样。
// 当前这个类,有如下的属性private final String shipNo;
private final String menuId;
private final String menuName;
private final Double price;public static class Builder {          为了给对象的属性赋值,在内部构造了一个静态内部类,叫Builder;// 这里的属性和外部类的数属性是一模一样的。那我们怎么来给外部类的属性赋值呢?我们创建内部类的对象,然后通过内部类对象属性来给外部类属性赋值。private final String shipNo;private String menuId;private String menuName;private final Double price = 0.0;public Builder(String shipNo) {   // 可以通过构造方法给属性赋值,那这个属性是必须要填的。this.shipNo = shipNo;}public Builder menuId(String val) { // 除了构造方法之外,还想要给别的属性赋值menuId = val;return this; // 把当前赋过值的builder给返回}public Builder menuName(String val){menuName=val;return this; // 赋完值,把当前的内部类返回}public Purchase build() {  // 内部类提供了个方法,叫build(),返回的是外部类。return new Purchase(this); // 在build()方法里面,创建了个外部类对象。把内部类自己作为外部类的构造方法传参进去,是Builder类型。}
}private Purchase(Builder builder) { // 调用Purchase构造方法的时候,把静态内部类对象传进来// 在外部类的构造方法里面,把内部类的对象数据赋值给外部类的属性shipNo = builder.shipNo;  menuId = builder.menuId;menuName = builder.menuName;price = builder.price;
}
}

这样做的好处:

如果我现在有几十个属性,但是我并不需要给每一个属性赋值,可能我只需要给其中的5个属性赋值,这样我们就可以调用静态内部类里面的方法来单独给相关属性赋值。

这样我在构建对象时,就没有必要去写构造参数了,把参数从外部传进去,只用传入一个构造者就可以了。———— 这种方式就是构造器设计模式

其结果就是这种设置属性是多个方法连接的方式:

  public static void main(String[] args) {Purchase p=new Builder("S0001").menuId("11").menuName("宫保").build();  // 先创建一个内部类对象。接下来给内部类的对象属性赋值。// 赋完值之后,调用.build()方法,这样就能够返回一个外部类对象。// 而且在返回外部类对象时,把内部类的属性赋值给Purchase p。靠这种方式赋值。System.out.println(p.menuName);}

在创建对象时,直接把构造器Builder创建出来,然后给构造器Builder 的属性赋值,需要哪个属性就给哪个属性赋值。

也有另一种方式,省去代码的builder写法,就是使用lombok:

import lombok.Builder;
import lombok.Data;@Builder
@Data
public class LomBokDemo {private String name;private Integer age;public static void main(String[] args) {LomBokDemo wyz = LomBokDemo.builder().age(12).name("张三").build();System.out.println(wyz);}
}

希望大家可以关注下公众号,会定期分享自己从业经历、技术积累及踩坑经验,支持一下,鞠躬感谢~

关注公众号,回复“资料全集”,不定期最新大数据业内资讯。

Java的建造者模式(builder)相关推荐

  1. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

  2. 建造者模式(Builder)——从组装电脑开始

    建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...

  3. Android设计模式之建造者模式builder

    今天小编来说一下Android中的一种设计模式--建造者模式Builder 绪论: 那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的Al ...

  4. Java 设计模式——建造者模式(Builder Pattern)

    前言 一.简介 ​二.实现方式 三.常见第一种方式 (1)一般有以下几个角色 (2)举个例子 (3)具体步骤 (4)具体代码 三.第二种方式 (1)主要有三个角色:抽象建造者.具体建造者.产品 (2) ...

  5. 设计模式之—建造者模式(Builder)-Java实现

    Builder模式,将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部 表象的产品对象.建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节.建造模式可以 ...

  6. 我的Java设计模式-建造者模式

    在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...

  7. Activiti源码之建造者模式 Builder

    建造者模式介绍 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类 ...

  8. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  9. 07、人人都会设计模式:建造者模式--Builder

    PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/300cbb9ee7f2 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...

最新文章

  1. 摆放家具-家具类以及创建家具对象
  2. 换个姿势为安装包重签名
  3. pythonturtle库使用心得_记录我的Python学习之旅(一)关于turtle库的基本用法
  4. base64 golang 图片_golang基础学习-base64使用
  5. 在Unity编辑器中开发遇到问题BUG如何调试解决?
  6. Stanford CS230深度学习(六)目标检测、人脸识别和神经风格迁移
  7. linux 从github拉取更新_关于拉取请求
  8. 【caffe-windows】 caffe-master 之 matlab接口配置
  9. NOI十连测 第三测 T1
  10. TypeError: TF_SessionRun_wrapper: expected all values in input dict to be ndarray
  11. 最新《圣思园JavaSE实地培训系列教程》
  12. mac谷歌浏览器怎么登陆账户_苹果电脑怎么安装谷歌浏览器_macbook如何下载安装谷歌浏览器-win7之家...
  13. java地理位置的获取_Java 根据 IP 获取地理位置
  14. win7无线热点_台式机无线网卡 简介以及指南
  15. sql语句左连接时的ON AND用法
  16. The Elder(树形dp 斜率优化)
  17. ZZNU2141: 2333
  18. SIM7600CE-CNSE 4G模组发送英文短信
  19. Ruby on rails 实战圣经:Part 2: 深度剖析环境设定与Bundler
  20. 以mysql为例有几种隔离级别_mysql有几种隔离级别

热门文章

  1. [ctfhub.pwn] 第12-14题
  2. Mybatis 源码解析(六) Mybatis方言支持
  3. GameFi独角兽区块帝国,今日开启全球IDO
  4. 前端如何做好数据容错
  5. dubbo负载容错策略
  6. ANSYS Fluent UDF Manual 2020R2
  7. 出战LOL,攻击类常见装备有什么?
  8. mysql怎么定位cpu高_Mysql数据库服务器CPU冲高问题定位及分析
  9. 1970年计算的时间转日期
  10. 配流01—DIAL算法(经典)