大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示
一句话概括:
使用多个简单对象一步一步构建成复杂对象,将复杂对象的构建与表示相分离。
补充介绍:
建造者模式(Builder Pattern)中有一个 Builder 类,这个类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
建造者模式的目的是将复杂对象的构建与表示相分离,使同样的构建过程可以构建不同的表示。将复杂对象的变与不变相分开。
建造高楼大厦时,需要打地基,搭建框架,浇灌混泥土,一层一层盖起来。建造高楼大厦就好比用Builder模式构建一个复杂对象。
肯德基的炸鸡汉堡薯条可乐,可以拼凑在一起成为一个套餐。
参与角色:
1)抽象建造类
2)建造类的实现类(多个不同实现类)
3)复杂对象类
优点:
1)建造者独立,易于扩展;
2)便于控制细节风险
缺点:
1)产品必须有共同点,范围有限制;
2)如果内部变化复杂,会有很多建造类
使用案例或场景:
使用场景:一个类的基本部件不会变,但是其组合一直变化的时候。
需要生成的对象具有复杂的内部结构,需要生成的对象内部本身相互依赖。
案例:肯德基麦当劳的基本食品:汉堡,薯条,炸鸡,可乐…这些东西是不会变得,但是套餐却各种玩法都有,所以可以通过这些基本对象去构建一个复杂对象。Java中的StringBuilder,是根据基本字符串构建出一个复杂字符串。还有Spring Boot 启动类中的SpringApplication对象也是通过builder构建出来的,Spring Cloud Stream中的消息对象,也是builder出来的。
示例程序
需要源码的朋友可以前往github下载:
https://github.com/aharddreamer/chendong/tree/master/design-patterns/demo-code/design-patterns
程序简介:
我们来看一段使用Builder模式编写文档的程序,编写出的文档具有以下结构:
1)含有一个标题;
2)含有几个字符串
3)含有条目项目
Builder类种定义了决定文档结构的方法,然后Director类使用该方法编写一个具体的文档。
Builder类是抽象类,它并没有进行任何实际的处理,仅仅声明了抽象方法。Builder类的子类决定了用来编写文档的具体处理。
在示例程序中,我们定义了以下Builder类的子类。
TextBuilder类:使用纯文本(普通字符串)编写文档
HTMLBuilder类: 使用HTML编写文档
类清单:
Builder 定义了决定文档结构的方法的抽象类
Director 编写一个文档的类
TextBuilder 使用纯文本编写文档的类
HTMLBuilder 使用HTML编写文档的类
BuilderPatternTest 测试类
代码:
public abstract class Builder {public abstract void makeTitle(String title);public abstract void makeString(String str);public abstract void makeItems(String[] items);public abstract void close();
}public class Director {private Builder builder;public Director (Builder builder) {this.builder = builder;}public void construct() {//编写文档builder.makeTitle("美好的一天");builder.makeString("从早上到下午");builder.makeItems(new String[]{"早上好","下午好",});builder.makeString("晚上");builder.makeItems(new String[]{"晚上好","晚安",});//完成文档builder.close();}
}public class TextBuilder extends Builder {private StringBuilder buffer = new StringBuilder();@Overridepublic void makeTitle(String title) {buffer.append("==============Start Text Document===============\n");buffer.append("《");buffer.append(title);buffer.append("》");buffer.append("\n");}@Overridepublic void makeString(String str) {buffer.append(str);buffer.append("\n");}@Overridepublic void makeItems(String[] items) {for (int i = 0; i < items.length ; i++) {buffer.append(" ·" + items[i] + "\n");}buffer.append("\n");}@Overridepublic void close() {buffer.append("==============End Text Document===============\n");}public String getResult() {return buffer.toString();}
}public class HTMLBuilder extends Builder {private StringBuilder buffer = new StringBuilder();@Overridepublic void makeTitle(String title) {buffer.append("==============Start HTML Document===============\n");buffer.append("<h1>");buffer.append(title);buffer.append("</h1>");buffer.append("\n");}@Overridepublic void makeString(String str) {buffer.append("<p>");buffer.append(str);buffer.append("</p>");buffer.append("\n");}@Overridepublic void makeItems(String[] items) {buffer.append("<ur>");buffer.append("\n");for (int i = 0; i < items.length ; i++) {buffer.append("<li>" + items[i] + "</li>\n");}buffer.append("</ur>");buffer.append("\n");}@Overridepublic void close() {buffer.append("==============End HTML Document===============\n");}public String getResult() {return buffer.toString();}}public class BuilderPatternTest {public static void main(String[] args) {//Text BuilderTextBuilder textBuilder = new TextBuilder();Director director = new Director(textBuilder);director.construct();String result = textBuilder.getResult();System.out.println(result);System.out.println();System.out.println();//HTML BuilderHTMLBuilder htmlBuilder = new HTMLBuilder();director = new Director(htmlBuilder);director.construct();String htmlResult = htmlBuilder.getResult();System.out.println(htmlResult);}
}
运行结果:
==============Start Text Document===============
《美好的一天》
从早上到下午
·早上好
·下午好
晚上
·晚上好
·晚安
==============End Text Document===============
==============Start HTML Document===============
<h1>美好的一天</h1>
<p>从早上到下午</p>
<ur>
<li>早上好</li>
<li>下午好</li>
</ur>
<p>晚上</p>
<ur>
<li>晚上好</li>
<li>晚安</li>
</ur>
==============End HTML Document===============
参考:
《建造者模式》菜鸟教程网站
《图解设计模式》【日】结城浩著
大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示相关推荐
- Net设计模式实例之建造者模式(Builder Pattern)(2)
四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
- 设计模式(创建型)之建造者模式(Builder Pattern)
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- UE4 C++设计模式:建造者模式(Builder Pattern)
目录 描述 套路 使用场景 优缺点 UE4实践 具体复杂产品-门派角色 抽象建造者-角色构造器 具体建造者-纯阳角色构造器 具体建造者-七秀角色构造器 创建指挥者(Director)-角色创建指挥器 ...
- 不重复发明轮子 -- 模板模式 (Template Pattern) 介绍 使用场景案例分析 优缺点 及代码演示
一句话概括: 一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以重写方法实现,但调用将以抽象类中定义的方式进行. 补充介绍: 模板模式(Template Pattern)使得子类可以不改变一个 ...
- 使用建造者模式(Builder Pattern) 设计Excel导出场景,附源码
目录 建造者模式(Builder Pattern)简单介绍: 常见Excel导出场景 常见Excel 导出编码过程-结合过程查看代码 本文中的Excel导出使用方式 使用建造者模式设计Excel 导出 ...
- 说说设计模式~建造者模式(Builder)
建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...
- 建造者模式(Builder)——从组装电脑开始
建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...
- Android设计模式之建造者模式builder
今天小编来说一下Android中的一种设计模式--建造者模式Builder 绪论: 那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的Al ...
最新文章
- 2022 年计算机视觉的三大趋势
- 还原黑客电影中那些Hacking技术的真相
- 2018.11:大数据在政府统计中的应用、瓶颈及融合路径(余芳东)
- 错误ORA-04091: table is mutating, trigger/function may not see it的原因以及解决办法
- 第10章-定位、层级关系
- Python 爬虫---(3)Urllib库使用介绍
- SharePoint 2007 权限代码分享
- 菜单关联注册/注销 dll/ocx 文件
- Android沉浸式(侵入式)标题栏(状态栏)Status(三)
- H - 命运(动态规划) 数塔问题
- Tomcat 修改端口
- 微观交通仿真软件分析比较
- 7-2 符号配对 (25 分)(C语言版)
- 金蝶云苍穹笔记(三)
- COLA 2.0架构应用
- 云图数字iOS客户端
- java中代表人数的单词_计算列表中显示的单词数量
- 如何作一名成功创业者
- 爱奇艺低代码引擎:千变万化、快速搭建的万花筒
- 计算机清理垃圾文件丢失怎么恢复,电脑管家清理的文件怎么恢复
热门文章
- Java+集合系列3、骨骼惊奇之LinkedList
- Java学习之旅(二):生病的狗2(java例化)
- opencv的Mat中step的解释
- Matlab画带箭头的图
- ios浏览器微信支付回调页面_iOS H5微信支付和微信支付完成之后跳转回APP
- Unity实战篇 | 自己制作一个《大转盘抽奖》 小程序,顺便带你看看抽奖的水可以有多深
- 前端网站-文档、工具
- java json escape_关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)...
- uniapp 解决onReachBottom失效
- 电脑打不开u盘,总显示“本次操作由于这台计算机的限制而被取消,请与您的系统管理员联系”