前言

Builder模式是一种一步一步创建一个复杂对象的设计模式,这种设计模式的精髓就主要有两点:其一,用户使用简单,并且可以在不需要知道内部构建细节的情况下,就可以构建出复杂的对象模型;其二,对于设计者来说,这是一个解耦的过程,这种设计模式可以将构建的过程和具体的表示分离开来。

Builder模式的使用场景

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

示例

public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public static Builder builder() {return new Builder();}private User(Builder builder) {this.username = builder.username;this.password = builder.password;}public static class Builder {private String username;private String password;public Builder setUserName(String username) {this.username = username;return this;}public Builder setPassword(String password){this.password=password;return this;}public User build() {return new User(this);}@Overridepublic String toString() {return "Builder{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}public static void main(String[] args) {Builder builder = new User.Builder();builder.setUserName("lss0555").setPassword("12345").build();//或者User user = new User.Builder().setUserName("lss0555").setPassword("123123").build();//或者User user1 = User.builder().setUserName("lss0555").setPassword("654321").build();System.out.println("builder结果:"+builder.toString());System.out.println("User结果:"+user.toString());System.out.println("User2结果:"+user1.toString());}
}
结果

builder结果:Builder{username=’lss0555’, password=’12345’}
User结果:User{username=’lss0555’, password=’123123’}
User2结果:User{username=’lss0555’, password=’654321’}

总结

Builder模式与传统的模式相比,Builder模式的代码量会比正常多不少,但是随之带来的好处是代码的可读性和可维护性。但是,往往一个好的设计模式或架构,就是在牺牲某一种能力从而大大增强另一种能力,例如,牺牲一定的可读性,增加项目的可扩展性等等这样的方式。因此,在参数较为复杂,构造对象相对繁琐的情况下,可以考虑使用Builder模式。

Java之Builder模式相关推荐

  1. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  2. effective java之 builder模式

    在java开发中我们经常需要创建对象 ,我们常用的创建对象的方法有两种  1  使用构造器来创建对象 如果有多个可变参数 ,就需要写多个构造方法,这种方法在遇到多个参数时不好控制 2. javabea ...

  3. Java之Builder模式使用

    之前用过听过builder设计模式,但自己的代码中从来没有应用过,只知道在做GUI开发时用到的控件,它们当中有些使用了builder设计模式.自己也不明白在什么场景下才应该使用. 先说说我遇到的实际情 ...

  4. Java设计模式-Builder模式

    Builder模式是将一个复杂对象的创建和表示分离,使同样的创建过程可以创建不同的表示.它属于建造类模式. 一般来说,如果一个对象的创建比较复杂,超出了构造方法所能包含的范围,就可以使用工厂模式和Bu ...

  5. Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式

    Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式 一.概述 模板设计模式: 父类定义通用抽象的功能方法,子类负责具体的实现. 本文将以一个通 ...

  6. Java 常用设计模式 -- Builder模式

    Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...

  7. JAVA Builder模式构建MAP/LIST的示例

    我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...

  8. java的设计模式 - Builder模式

    Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...

  9. java设计模式-Builder创建者模式

    问题分析: Builder模式是一步一步创建一个复杂对象的创建型模式.该模式是为了将构建复杂对象的过程和他的部件解耦,使得构建过程和部件的表示隔离开来. Builder模式 主要用于"构建一 ...

最新文章

  1. Where we can find sharepoint user list
  2. GitHub上那些值得一试的JAVA开源库--转
  3. python基础——Linux系统下的文件目录结构
  4. 使用 NetCoreBeauty 优化 .NET CORE 独立部署目录结构
  5. php生成有复杂结构的excel文档
  6. python爬取网页文字和图片_简单的爬虫:爬取网站内容正文与图片
  7. 每天固定往一个银行卡存入100元,5年之后会有多大变化?有人能坚持吗?
  8. iOS开发基础知识-多线程概念深入浅出
  9. IDEA webapp文件夹没有蓝色小圆点的解决方案
  10. IdentityServer4学习及简单使用
  11. 数据库系统概论第五版(第 2 章 关系数据库)习题答案
  12. Android APP原型设计,五款移动APP在线原型设计工具,值得收藏
  13. STM32通过SPI读W25Q64的ID时钟分析
  14. 前端导出word图片
  15. SQL Server数据分析面试题(202008)
  16. gps+wifi+mobile 5的手机参数对比
  17. SpiffWorkflow定制工作流
  18. 汉堡王什么汉堡好吃_KFC、汉堡王、麦当劳:谁家汉堡最适合减肥时吃?
  19. 超参数调试、Batch正则化
  20. 机器学习利用Anaconda搭建Python科学计算环境

热门文章

  1. PWM波启动无源蜂鸣器——基于STM32MP157A
  2. 数据库生成日然周、自然月、自然日
  3. 如何实现伸缩 /折叠报表
  4. socket接收与发送缓冲区大小
  5. localhost,127.0.0.1,本机IP
  6. 滴水逆向学习笔记 -1-
  7. Android 友盟推送收不到
  8. KSZ8081网络设计注意事项以及调试总结
  9. vue中src目录下的文件的说明
  10. 2022/07/17 软件设计师错题日志 Day 1