java设计模式--Builder模式
一.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
- @Getter
- @Setter
- @ToString //lombok的注解,方便代码查看以及编写
- public class Reservation {
- //Date, November 5, Headcount, 250, City, Shanghai, DollarsPerHead, 60,HasSite, false
- private Date date;
- private int headCount;
- private String city;
- private double dollarsPerHead;
- private boolean hasSite;
- }
ReservationBuilder.java
- public interface ReservationBuilder {
- public ReservationBuilder futurize(Date date) ;
- public ReservationBuilder setCity(String city);
- public ReservationBuilder setDollarsPerHead(double dollarsPerHead);
- public ReservationBuilder setSite(boolean hasSite);
- public ReservationBuilder setHeadCount(int headCount);
- Reservation build();
- }
DefaultReservationBuilder.java
- public class DefaultReservationBuilder implements ReservationBuilder{
- private Date date;
- private int headCount;
- private String city;
- private double dollarsPerHead;
- private boolean hasSite;
- public ReservationBuilder futurize(Date date) {
- this.date=date;
- return this;
- }
- public ReservationBuilder setCity(String city) {
- this.city=city;
- return this;
- }
- public ReservationBuilder setDollarsPerHead(double dollarsPerHead) {
- this.dollarsPerHead=dollarsPerHead;
- return this;
- }
- public ReservationBuilder setSite(boolean hasSite) {
- this.hasSite=hasSite;
- return this;
- }
- public ReservationBuilder setHeadCount(int headCount) {
- this.headCount=headCount;
- return this;
- }
- public Reservation build() {
- Reservation reservation = new Reservation();
- reservation.setCity(this.city);
- reservation.setDate(this.date);
- reservation.setDollarsPerHead(this.dollarsPerHead);
- reservation.setHasSite(this.hasSite);
- reservation.setHeadCount(this.headCount);
- return reservation;
- }
- }
ReservationDirector.java
- public class ReservationDirector {
- private ReservationBuilder builder;
- public ReservationDirector(ReservationBuilder builder) {
- this.builder=builder;
- }
- public Reservation construct(String input) throws Exception {
- String[] strings = input.split(",\\s*");
- for(int i=0;i<strings.length-1;i++) {
- String type=strings[i];
- String val=strings[i+1];
- if("date".equalsIgnoreCase(type)) {
- int year = Calendar.getInstance().get(Calendar.YEAR);
- String res=year+ " "+val.substring(0, 3)+" "+val.substring(val.length()-2);
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy MMM dd", Locale.ENGLISH);
- Date date = sdf.parse(res);
- builder.futurize(date);
- }else if("headcount".equalsIgnoreCase(type)) {
- builder.setHeadCount(Integer.valueOf(val));
- }else if("city".equalsIgnoreCase(type)) {
- builder.setCity(val);
- }else if("dollarsperHead".equalsIgnoreCase(type)) {
- builder.setDollarsPerHead(Double.parseDouble(val));
- }else if("hassite".equalsIgnoreCase(type)) {
- builder.setSite(Boolean.parseBoolean(val));
- }
- }
- Reservation reservation = builder.build();
- return reservation;
- }
- }
测试方法:
- public static void main(String[] args) throws Exception {
- //Date, November 5, Headcount, 250, City, Shanghai, DollarsPerHead, 60,HasSite, false
- String input="Date, November 5, Headcount, 20, City, Shanghai, DollarsPerHead, 60,HasSite, false";
- ReservationBuilder builder=new DefaultReservationBuilder();
- ReservationDirector director=new ReservationDirector(builder);
- Reservation reservation = director.construct(input);
- System.out.println(reservation);
- }
测试输出:
三.Spring中的Builder模式
Spring中 RequestMappingInfo中内部接口Builder 、内部静态类DefaultBuilder等,就是采用了Builer模式,RequestMappingInfo就是监工Director对象;类结构图:
- public interface Builder {
- /* Set the path patterns*/
- Builder paths(String... paths);
- /* Set the request method conditions*/
- Builder methods(RequestMethod... methods);
- /* Set the request param conditions*/
- Builder params(String... params);
- /*Set the header conditions*/
- Builder headers(String... headers);
- /* Set the consumes conditions*/
- Builder consumes(String... consumes);
- /* Set the produces conditions*/
- Builder produces(String... produces);
- /* Set the mapping name*/
- Builder mappingName(String name);
- /* Set a custom condition to use*/
- Builder customCondition(RequestCondition<?> condition);
- /* Provide additional configuration needed for request mapping purposes*/
- Builder options(BuilderConfiguration options);
- /** Build the RequestMappingInfo*/
- RequestMappingInfo build();
- }
创建RequestMappingInfo对象地方:作用就是解析RequestMapping注解生成对应RequestMappingInfo对象;
Builder方法大部分返回值为Builder类型,作用是为了链式执行,看起来生成RequestMappingInfo对象代码只有一句简洁;
java设计模式--Builder模式的更多相关文章
- 3.java设计模式-建造者模式
Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- java设计模式--单列模式
java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- Java设计模式——外观模式
JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构
- 【设计模式】Java设计模式 -工厂模式
[设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...
- 【设计模式】Java设计模式 - 原型模式
[设计模式]Java设计模式 - 原型模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...
- 【设计模式】Java设计模式 - 桥接模式
[设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...
- 【设计模式】Java设计模式 - 组合模式
Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
随机推荐
- hdu 4891 模拟水题
http://acm.hdu.edu.cn/showproblem.php?pid=4891 给出一个文本,问说有多少种理解方式. 1. $$中间的,(s1+1) * (s2+1) * ...*(sn ...
- POJ3046选蚂蚁创建集合_线性DP
POJ3046选蚂蚁创建集合 一个人的精力是有限的呢,如果一直做一件事迟早会疲惫,所以自己要把握好,不要一直埋头于一件事,否则效率低下还浪费时间 题目大意:一共有T(1,2...n为其种类)种蚂蚁,A ...
- 一个前端小白,关于vue\react等框架下table的应用总结
出来实习一个月多,对于前端,运用相关的最多的就是table,想总结一下先关的内容 一.table提供的功能 1.显示表 2.可编辑:分为可编辑行和可编辑块,但是原理都一样就是设置一个flag,true ...
- day03_雷神_文件操作
day03 上周回顾_问题总结: 地址值: li = [] name = ['name','price','count'] dic = {} #如果这里定义空列表,后边的dic[name[i]] = ...
- cpu信息查看
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...
- Windows远程桌面连接ubuntu 16
一.安装Xrdp Windows远程桌面使用的是RDP协议,所以ubuntu上就要先安装Xrdp,在ubuntu软件中心搜索xrdp安装. 安装xrdp的同时会自动安装vnc4server,xbase ...
- 查看指定spid的脚本当前运行情况和状态
USE MasterGO declare @spid int; select @spid = 419--null:all ; ;WITH DATA(spid,blockRelationship,blo ...
- 【C#】转一篇MSDN杂志文:ASP.NET Pipeline: Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code
序:这是一篇发表在2003年6月刊的MSDN Magazine的文章,现在已经不能在线阅读,只提供chm下载.讲的是异步请求处理那些事,正是我上一篇博文涉及的东西(BTW,事实上这篇杂志阐述了那么搞然 ...
- 记录.NET Core在CentOS上基于Jenkins自动化发布
1.安装Jenkins,我这里采用的是非docker方式安装(两种都行,任选一种) 参考:https://www.cnblogs.com/xiaxiaolu/p/10357806.html https ...
- ADB 命令介绍
Android adb shell am 命令介绍 am这个指令是 activity manager的缩写.这个命令可以启动Activity.打开或关闭进程.发送广播等操作. am命令格式如下 adb ...