一起学设计模式 - 建造者模式
建造者模式(Builder Pattern)
属于创建型模式
的一种,将多个简单对象构建成一个复杂的对象,构建过程抽象化,不同实现方法可以构造出不同表现(属性)的对象,还提供了一种更加优雅构建对象的方式…
概述
有时候构建一个复杂的对象,需要经过好几步的处理,比如常用的StringBuffer、StringBuilder、以及Swagger(一种接口文档)
,都是以这种模式构建对象的
优点
建造者模式
比较独立,将对象本身与构建过程解耦- 精准控制构建出的对象和内容,构造层和显示层是分离的
- 写法上更加优雅
缺点
- 范围受限,不适合差异较大的对象
- 内部复杂多变,构造类相对会多
适用场景
- 构建具有共同特性的复杂对象
相关模式
抽象工厂模式与建造者模式相似
,因为它也可以创建复杂对象。主要的区别是建造者模式
着重于一步步得构造出复杂对象。而抽象工厂模式
着重于多个系列的产品对象(简单的或是复杂的)。建造者
是在最后的一步返回对象,而对于抽象工厂来说,对象是立即返回的。
案例
传统方式
public class Summoner {private String name;private String type;private String innate;public Summoner(String name, String type, String innate) {this.name = name;this.type = type;this.innate = innate;}
}
简单的对象我们可以使用下面这种方式,因为属性较少这种方式还看的,但不幸的是如果要增加字段或我们还需要去扩展构造方法,且可读性
不好,相同类型的情况下在一定程度上混淆视听了
Summoner s1 = new Summoner("德玛","战士","战争雷霆");
为什么不调用无参数的构造函数,通过
setter
方法来减轻问题。
解答: 如果程序员忘记调用一个特定的setter
方法会发生什么?我们可能得到的是一个部分初始化的对象,而且编译器也不会检测出任何问题。
- 构造函数参数太多
- 错误的对象状态
使用模式
在我们的示例中,改造下召唤师类
public class Summoner {private String name;private String type;private String innate;private Summoner(Builder builder) {this.name = builder.name;this.type = builder.type;this.innate = builder.innate;}protected static class Builder {private String name;private String type;private String innate;protected Builder name(String name) {this.name = name;return this;}protected Builder type(String type) {this.type = type;return this;}protected Builder innate(String innate) {this.innate = innate;return this;}protected Summoner build() {return new Summoner(this);}}
}public class BuilderDemo {public static void main(String[] args) {Summoner monkey = new Summoner.Builder().name("齐天大圣 - 孙悟空").type("上单 - AD").innate("基石天赋 - 战争雷霆").build();System.out.println(monkey.toString());Summoner mouse = new Summoner.Builder().name("瘟疫之源 - 图奇").type("下路 - ADC").innate("基石天赋 - 战阵热诚").build();System.out.println(mouse.toString());Summoner diann = new Summoner.Builder().name("皎月女神 - 戴安娜").type("中单 - AP").build();System.out.println(diann.toString());}
}
建造者模式
让我们写的代码更具可读性,可理解为建立复杂的物体。它往往是实现一个连贯的操作,从而更加直观,此处由于类型较为单一差距不大,但遇到复杂对象构建差距就立竿见影了
Summoner{name='齐天大圣 - 孙悟空', type='上单 - AD', innate='基石天赋 - 战争雷霆'}
Summoner{name='瘟疫之源 - 图奇', type='下路 - ADC', innate='基石天赋 - 战阵热诚'}
Summoner{name='皎月女神 - 戴安娜', type='中单 - AP', innate='null'}
总结
我们通过一个简单的代码例子开始,慢慢变得复杂。然后使用Builder模式
来解决我们发现的问题。
如果你发现自己在一个情况下,你不断添加新参数的构造函数,使得代码变得容易出错,很难读,也许可以考虑使用一个Builder
重构你的代码。
推荐
- lombok: https://github.com/rzwitserloot/lombok
- IntelliJ IDEA : InnerBuilder 插件
- 说点什么
全文代码:https://gitee.com/battcn/design-pattern/tree/master/Chapter4/battcn-builder
- 个人QQ:1837307557
- battcn开源群(适合新手):391619659
微信公众号:battcn
(欢迎调戏)
一起学设计模式 - 建造者模式相关推荐
- Python设计模式-建造者模式
Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...
- 说说设计模式~建造者模式(Builder)
建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...
- 设计模式 建造者模式_设计模式:建造者
设计模式 建造者模式 有时需要在应用程序中创建一个复杂的对象. 一种解决方案是Factory模式,另一种是Builder设计模式. 在某些情况下,您甚至可以结合使用这两种模式. 但是在本文中,我想研究 ...
- 设计建造者模式java代码,Java设计模式-建造者模式
定义 Separate the construction of a complex object from its representation so that the sameconstructio ...
- python创造者_python 设计模式-建造者模式
问题:在上一篇python设计模式:抽象工厂模式中,我们尝试用抽象工厂模式规范化了 Pizza 原材料的供应以及 Pizza 的创建.但是我们忽略了一个问题,那就是每种 Pizza 的烘焙时间依赖于生 ...
- java设计模式-建造者模式
概念:使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. ...
- 设计模式-建造者模式(转自:http://www.cnblogs.com/cbf4life/archive/2010/01/14/1647710.html)...
11.1 变化是永恒的 又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:"牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制作了,不过这次又额外增 ...
- 大话设计模式—建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类会一步一步构造最 ...
- 我的Java设计模式-建造者模式
在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...
最新文章
- 麦肯锡AI应用报告:深度学习是蓝海还是深坑?
- photoshop(ps) cs6中文版
- 查询数据库游标使用情况以及sql
- oracle对象之触发器
- 如何使用小程序自定义组件功能
- 事务不是与当前连接无关联就是已完成_mysql索引锁事务
- Jasmine基础API
- 阿里云服务器价格表:第7代云服务器ECS收费价格表
- matlab 彩色图片分解,MATLAB 彩色图像分割
- mysql实现oracle的同义词_Oracle 同义词synonym 学习
- 32位计算机的内存限额,32位系统支持多大内存 如何完全使用32位4G内存
- 关于SIR模型性质的进一步摘录
- 2010爆牙笑话第一季!【转】
- 如何将caj转换成word?caj转Word工具
- 【背包问题】基于matlab禁忌搜索算法求解背包问题【含Matlab源码 373期】
- LifecycleOwner xx is attempting to register while current state is RESUMED. LifecycleOwners must cal
- 地形因子分类整合方案
- 单目标跟踪算法调研(2019)
- nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression
- java 过滤关键字 自定义字典库
热门文章
- python的价值观_Python beauthulsoup刮刮雅虎财经价值观
- 微赞html写入,微赞WZ-后台一键更新-授权
- Tk_Batis 介绍和用法以及和Jpa 的区别
- Leetcode501. Morris中序遍历
- python中符号的用法_python中的@符号的作用
- 3000万存款的陈奕迅哭穷,真不是无病呻吟!
- 解决steam 上origin 安装超级慢的问题 [已解决]
- 基于JAVA学生健康管理系统计算机毕业设计源码+系统+数据库+lw文档+部署
- 零基础做算法?清华计算机系学长带你斩获大厂算法校招SSP
- php丢失msvcr110.dll,计算机中丢失MSVCR110.dll的解决办法