博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
建造者模式
阅读量:5765 次
发布时间:2019-06-18

本文共 1746 字,大约阅读时间需要 5 分钟。

hot3.png

为什么要使用建造者模式?

  1. 将复杂对象的构造和展示相分离,使用不同的建造者的实现能得到不同的结果
  2. 避免过多的构造函数和setter方法
  3. 更方便构造不可变对象,线程安全

ps:使用lombok的@Builder注解可以自动给我们生成建造者模式代码

 

 

package com.kuaikan.sample.springboot.aop;public class User {    private final int age; // optional    private final String phone; // optional    private final String address; // optional    private User(UserBuilder builder) {        this.age = builder.age;        this.phone = builder.phone;        this.address = builder.address;    }    public int getAge() {        return age;    }    public String getPhone() {        return phone;    }    public String getAddress() {        return address;    }    public static class UserBuilder {        private int age;        private String phone;        private String address;        private UserBuilder() {        }        public static UserBuilder newBuilder() {            return  new UserBuilder();        }        public UserBuilder age(int age) {            this.age = age;            return this;        }        public UserBuilder phone(String phone) {            this.phone = phone;            return this;        }        public UserBuilder address(String address) {            this.address = address;            return this;        }        public User build() {            return new User(this);        }    }    public static void main(String[] args) {        User user = UserBuilder.newBuilder()                .address("")                .age(11)                .phone("123")                .build();    }}

 

建造者模式优点

  • User构造方法是私有的,这意味着该类不能在客户端代码里直接实例化。
  • 该类现在又是不可变的了。所有属性都是final类型的,在构造方法里面被赋值。另外,我们只为它们提供了getter方法。
  • builder类使用流式接口风格,让客户端代码阅读起来更容易(我们马上就会看到一个它的例子)。
  • builder类构造方法只接收必须属性,为了确保这些属性在构造方法里赋值,只有这些属性被定义成final类型。

 

转载于:https://my.oschina.net/u/4129361/blog/3049159

你可能感兴趣的文章
Android项目总结(二)仿IOS效果的日期选择器和省市县三级联动
查看>>
iOS笔记
查看>>
SpringBoot基础篇Bean之条件注入@Condition使用姿势
查看>>
谁说深入浅出虚拟机难?现在我让他通俗易懂(JVM)
查看>>
React全家桶构建一款Web音乐App实战(八):搜索功能开发
查看>>
mac上python多版本共存
查看>>
理解iOS中深浅拷贝-为什么NSString使用copy
查看>>
Machine learning学习记录,(一)
查看>>
我所理解的 MVC
查看>>
ES6与CommonJS中的模块处理
查看>>
那些年,我爬过的北科(三)——爬虫进阶之多进程的使用
查看>>
理解Node.Js事件循环,写出高性能代码。
查看>>
iOS 实现展开TableViewCell,下拉cell
查看>>
Android 多线程之几个基本问题
查看>>
面试官:来,给本官讲讲前端页面性能优化及错误处理有哪些?(看你懵不懵)...
查看>>
nodejs实现简单爬虫爬取http://web.jobbole.com/网址数据
查看>>
在搭建vue项目中,解决vue不是内部或者外部命令的问题
查看>>
Proxy 对象
查看>>
技术人如何提升自己(推荐必读)
查看>>
UIStatusBarStyle 解惑
查看>>