文档章节

创建型模式之四:建造者模式

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:35
字数 516
阅读 18
收藏 0
点赞 0
评论 0

建造者模式的关键特征是他涉及一个逐步的过程去构建东西。例如,每个产品会通过相同的过程,不同的是过程中的步骤不同。 在下面的例子中,我们能定义一个饮料的建造者叫StarbuscksBuilder,他将通过一系列的步骤来建造一杯叫Starbucks的饮料,像buildSize()方法和buildDrink方法,最后会返回已建造的饮料。

建造者模式类图

建造者模式Java代码

1
package designpatterns.builder;
 
// produce to be built
class Starbucks {
 private String size;
 private String drink;
 
 public void setSize(String size) {
 this.size = size;
 }
 
 public void setDrink(String drink) {
 this.drink = drink;
 }
}
 
//abstract builder
abstract class StarbucksBuilder {
 protected Starbucks starbucks;
 
 public Starbucks getStarbucks() {
 return starbucks;
 }
 
 public void createStarbucks() {
 starbucks = new Starbucks();
 System.out.println("a drink is created");
 }
 
 public abstract void buildSize();
 public abstract void buildDrink();
}
 
// Concrete Builder to build tea
class TeaBuilder extends StarbucksBuilder {
 public void buildSize() {
 starbucks.setSize("large");
 System.out.println("build large size");
 }
 
 public void buildDrink() {
 starbucks.setDrink("tea");
 System.out.println("build tea");
 }
 
}
 
// Concrete builder to build coffee
class CoffeeBuilder extends StarbucksBuilder {
 public void buildSize() {
 starbucks.setSize("medium");
 System.out.println("build medium size");
 }
 
 public void buildDrink() {
 starbucks.setDrink("coffee");
 System.out.println("build coffee");
 }
}
 
//director to encapsulate the builder
class Waiter {
 private StarbucksBuilder starbucksBuilder;
 
 public void setStarbucksBuilder(StarbucksBuilder builder) {
 starbucksBuilder = builder;
 }
 
 public Starbucks getstarbucksDrink() {
 return starbucksBuilder.getStarbucks();
 }
 
 public void constructStarbucks() {
 starbucksBuilder.createStarbucks();
 starbucksBuilder.buildDrink();
 starbucksBuilder.buildSize();
 }
}
 
//customer
public class Customer {
 public static void main(String[] args) {
 Waiter waiter = new Waiter();
 StarbucksBuilder coffeeBuilder = new CoffeeBuilder();
 
 //Alternatively you can use tea builder to build a tea
 //StarbucksBuilder teaBuilder = new TeaBuilder();
 
 waiter.setStarbucksBuilder(coffeeBuilder);
 waiter.constructStarbucks();
 
 //get the drink built
 Starbucks drink = waiter.getstarbucksDrink();
 
 }
}

在java标准库中,StringBuilder 继承了 AbstractStringBuilder

StringBuilder strBuilder= new StringBuilder();
strBuilder.append("one");
strBuilder.append("two");
strBuilder.append("three");
String str= strBuilder.toString();

这个append()是过程中的一步,就像在Starbucks例子中的一步,toString()方法是最后一步,但是不同的是这是没有图中的waiter,在上图的建造者模式中waiter类扮演了一个导演的角色,但是这是没有这样的角色,所以他不是建造者模式。 当然,这不是唯一的原因,我们能对比类图的开始,并找到其他原因。 建造者模式用于,当需要许多步来构造一个对象,工厂模式用于,当很容易在一个方法中就构建一个实体对象。 

以上文章翻译自: http://www.programcreek.com/2013/02/java-design-pattern-builder/

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
炒冷饭系列:设计模式 建造者模式

炒冷饭系列:设计模式 建造者模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是建造者模式 ...

泥沙砖瓦浆木匠 ⋅ 2014/07/28 ⋅ 0

创建型模式--建造者模式(Builder)

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后...

shanxi_liyong ⋅ 2014/12/23 ⋅ 0

人人都会设计模式---建造者模式--Builder

PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/300cbb9ee… 本文出自 TigerChain 简书 人人都会设计模式 教程简介 1、阅读对象 本篇教程适合新手阅读,老手直接略过 2、教程...

TigerChain ⋅ 2017/12/03 ⋅ 0

07、建造者模式--Builder

本节课程大纲 PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/300cbb9ee7f2 本文出自 TigerChain 简书 人人都会设计模式 教程简介 1、阅读对象 本篇教程适合新手阅读,...

TigerChain ⋅ 2017/12/03 ⋅ 0

设计模式(创建型模式)——建造者模式(Builder)

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后...

小风89 ⋅ 2016/07/18 ⋅ 0

设计模式之五大创建型模式

一、概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 (2)结构型模式,共七种:适配器模式、装饰器模式、代理...

小城故事_ ⋅ 2016/03/19 ⋅ 0

JavaScript设计模式系列二之建造者模式(附案例源码)

文章初衷 设计模式其实旨在解决语言本身存在的缺陷, 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什...

小钱钱阿圣 ⋅ 2017/09/11 ⋅ 0

设计模式之6个创建模式

创建型模式概述 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同...

randy_shandong ⋅ 2017/01/11 ⋅ 0

小菜学设计模式——设计模式总结之创建型

1、面向过程与面向对象 1)面向过程通过划分功能模块,通过函数间相互调用来实现,但需求变化时就需要更改函数,而你改动的函数有多少地方在调用她呢?关联多少数据,这是很不容易弄得清楚地...

learn_more ⋅ 2015/07/05 ⋅ 0

从ES6重新认识JavaScript设计模式(三): 建造者模式

1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示。 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序...

Lee_tanghui ⋅ 06/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 47分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部