一.Builder模式

二.使用例子

三.Spring中的Builder模式

Builder模式,构建者、构造者模式,在《图解设计模式》中归为 生成实例 一栏,该模式用于组装具有复杂结构的实例;

    当需要逐步获取对象的初始值时,可以使用Builder模式;

一.Builder模式角色

Builder:建造者,Builder角色负责定义用来生成实例的接口API,Builder角色中准备了用于生成实例的具体方法;

ConcreteBuilder:具体的建造者,负责实现Builder接口的的类,定义了生成实例时实际调用的方法,定义了获取最终生成结果的方法;

Director:监工,负责使用Builder角色的接口来生成实例,不依赖于ConcreteBuilder;

二.使用例子

Demo:比如有一段预约信息,将其解析为  预约 对象; 预约信息如下:"Date, November 5, Headcount, 250, City, Shanghai, DollarsPerHead, 60,HasSite, false";

date为预约日期,headCount为预期来人数,city为城市,DollarsPerHead为人均预算,hasSite为是否提供地址(比如预约某场演出,是否给表演者提供地点了);

类结构图:

预约信息  Reservation.java

  1. @Getter
  2. @Setter
  3. @ToString //lombok的注解,方便代码查看以及编写
  4. public class Reservation {
  5. //Date, November 5, Headcount, 250, City, Shanghai, DollarsPerHead, 60,HasSite, false
  6. private Date date;
  7. private int headCount;
  8. private String city;
  9. private double dollarsPerHead;
  10. private boolean hasSite;
  11. }

ReservationBuilder.java

  1. public interface ReservationBuilder {
  2.  
  3. public ReservationBuilder futurize(Date date) ;
  4.  
  5. public ReservationBuilder setCity(String city);
  6.  
  7. public ReservationBuilder setDollarsPerHead(double dollarsPerHead);
  8.  
  9. public ReservationBuilder setSite(boolean hasSite);
  10.  
  11. public ReservationBuilder setHeadCount(int headCount);
  12.  
  13. Reservation build();
  14. }

DefaultReservationBuilder.java

  1. public class DefaultReservationBuilder implements ReservationBuilder{
  2. private Date date;
  3. private int headCount;
  4. private String city;
  5. private double dollarsPerHead;
  6. private boolean hasSite;
  7.  
  8. public ReservationBuilder futurize(Date date) {
  9. this.date=date;
  10. return this;
  11. }
  12.  
  13. public ReservationBuilder setCity(String city) {
  14. this.city=city;
  15. return this;
  16. }
  17.  
  18. public ReservationBuilder setDollarsPerHead(double dollarsPerHead) {
  19. this.dollarsPerHead=dollarsPerHead;
  20. return this;
  21. }
  22.  
  23. public ReservationBuilder setSite(boolean hasSite) {
  24. this.hasSite=hasSite;
  25. return this;
  26. }
  27.  
  28. public ReservationBuilder setHeadCount(int headCount) {
  29. this.headCount=headCount;
  30. return this;
  31. }
  32.  
  33. public Reservation build() {
  34. Reservation reservation = new Reservation();
  35. reservation.setCity(this.city);
  36. reservation.setDate(this.date);
  37. reservation.setDollarsPerHead(this.dollarsPerHead);
  38. reservation.setHasSite(this.hasSite);
  39. reservation.setHeadCount(this.headCount);
  40. return reservation;
  41. }
  42. }

ReservationDirector.java

  1. public class ReservationDirector {
  2.  
  3. private ReservationBuilder builder;
  4. public ReservationDirector(ReservationBuilder builder) {
  5. this.builder=builder;
  6. }
  7.  
  8. public Reservation construct(String input) throws Exception {
  9. String[] strings = input.split(",\\s*");
  10. for(int i=0;i<strings.length-1;i++) {
  11. String type=strings[i];
  12. String val=strings[i+1];
  13. if("date".equalsIgnoreCase(type)) {
  14. int year = Calendar.getInstance().get(Calendar.YEAR);
  15. String res=year+ " "+val.substring(0, 3)+" "+val.substring(val.length()-2);
  16. SimpleDateFormat sdf = new SimpleDateFormat("yyyy MMM dd", Locale.ENGLISH);
  17. Date date = sdf.parse(res);
  18. builder.futurize(date);
  19. }else if("headcount".equalsIgnoreCase(type)) {
  20. builder.setHeadCount(Integer.valueOf(val));
  21. }else if("city".equalsIgnoreCase(type)) {
  22. builder.setCity(val);
  23. }else if("dollarsperHead".equalsIgnoreCase(type)) {
  24. builder.setDollarsPerHead(Double.parseDouble(val));
  25. }else if("hassite".equalsIgnoreCase(type)) {
  26. builder.setSite(Boolean.parseBoolean(val));
  27. }
  28. }
  29. Reservation reservation = builder.build();
  30. return reservation;
  31. }
  32. }

测试方法:

  1. public static void main(String[] args) throws Exception {
  2. //Date, November 5, Headcount, 250, City, Shanghai, DollarsPerHead, 60,HasSite, false
  3. String input="Date, November 5, Headcount, 20, City, Shanghai, DollarsPerHead, 60,HasSite, false";
  4. ReservationBuilder builder=new DefaultReservationBuilder();
  5. ReservationDirector director=new ReservationDirector(builder);
  6. Reservation reservation = director.construct(input);
  7. System.out.println(reservation);
  8. }

测试输出:

三.Spring中的Builder模式

  Spring中 RequestMappingInfo中内部接口Builder 、内部静态类DefaultBuilder等,就是采用了Builer模式,RequestMappingInfo就是监工Director对象;类结构图:

  1. public interface Builder {
  2. /* Set the path patterns*/
  3. Builder paths(String... paths);
  4.  
  5. /* Set the request method conditions*/
  6. Builder methods(RequestMethod... methods);
  7. /* Set the request param conditions*/
  8. Builder params(String... params);
  9.  
  10. /*Set the header conditions*/
  11. Builder headers(String... headers);
  12.  
  13. /* Set the consumes conditions*/
  14. Builder consumes(String... consumes);
  15.  
  16. /* Set the produces conditions*/
  17. Builder produces(String... produces);
  18.  
  19. /* Set the mapping name*/
  20. Builder mappingName(String name);
  21.  
  22. /* Set a custom condition to use*/
  23. Builder customCondition(RequestCondition<?> condition);
  24.  
  25. /* Provide additional configuration needed for request mapping purposes*/
  26. Builder options(BuilderConfiguration options);
  27.  
  28. /** Build the RequestMappingInfo*/
  29. RequestMappingInfo build();
  30. }

创建RequestMappingInfo对象地方:作用就是解析RequestMapping注解生成对应RequestMappingInfo对象;

Builder方法大部分返回值为Builder类型,作用是为了链式执行,看起来生成RequestMappingInfo对象代码只有一句简洁;

java设计模式--Builder模式的更多相关文章

  1. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  2. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  3. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

  4. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  5. Java设计模式——外观模式

    JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构

  6. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...

  7. 【设计模式】Java设计模式 - 原型模式

    [设计模式]Java设计模式 - 原型模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  8. 【设计模式】Java设计模式 - 桥接模式

    [设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  9. 【设计模式】Java设计模式 - 组合模式

    Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

随机推荐

  1. hdu 4891 模拟水题

    http://acm.hdu.edu.cn/showproblem.php?pid=4891 给出一个文本,问说有多少种理解方式. 1. $$中间的,(s1+1) * (s2+1) * ...*(sn ...

  2. POJ3046选蚂蚁创建集合_线性DP

    POJ3046选蚂蚁创建集合 一个人的精力是有限的呢,如果一直做一件事迟早会疲惫,所以自己要把握好,不要一直埋头于一件事,否则效率低下还浪费时间 题目大意:一共有T(1,2...n为其种类)种蚂蚁,A ...

  3. 一个前端小白,关于vue\react等框架下table的应用总结

    出来实习一个月多,对于前端,运用相关的最多的就是table,想总结一下先关的内容 一.table提供的功能 1.显示表 2.可编辑:分为可编辑行和可编辑块,但是原理都一样就是设置一个flag,true ...

  4. day03_雷神_文件操作

    day03 上周回顾_问题总结: 地址值: li = [] name = ['name','price','count'] dic = {} #如果这里定义空列表,后边的dic[name[i]] = ...

  5. cpu信息查看

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  6. Windows远程桌面连接ubuntu 16

    一.安装Xrdp Windows远程桌面使用的是RDP协议,所以ubuntu上就要先安装Xrdp,在ubuntu软件中心搜索xrdp安装. 安装xrdp的同时会自动安装vnc4server,xbase ...

  7. 查看指定spid的脚本当前运行情况和状态

    USE MasterGO declare @spid int; select @spid = 419--null:all ; ;WITH DATA(spid,blockRelationship,blo ...

  8. 【C#】转一篇MSDN杂志文:ASP.NET Pipeline: Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code

    序:这是一篇发表在2003年6月刊的MSDN Magazine的文章,现在已经不能在线阅读,只提供chm下载.讲的是异步请求处理那些事,正是我上一篇博文涉及的东西(BTW,事实上这篇杂志阐述了那么搞然 ...

  9. 记录.NET Core在CentOS上基于Jenkins自动化发布

    1.安装Jenkins,我这里采用的是非docker方式安装(两种都行,任选一种) 参考:https://www.cnblogs.com/xiaxiaolu/p/10357806.html https ...

  10. ADB 命令介绍

    Android adb shell am 命令介绍 am这个指令是 activity manager的缩写.这个命令可以启动Activity.打开或关闭进程.发送广播等操作. am命令格式如下 adb ...