建造者模式(Builder)
GOF:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
类图:
适用性:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
效果:
- 它使你可以改变一个产品的内部表示。你可以通过定义一个新的ConcreteBuilder来产生不同的产品。
- 它将构造代码和表示代码分开。
- 它使你可对构造过程进行更精细的控制。Builder接口能很好地反映产品的构造过程。
通过建造者模式,用户只需指定需要建造的类型就可以得到它们,而具体的建造过程和细节就不需要知道了。实际上建造者模式就是将创建的流程放到抽象类(或接口)中,将流程中的具体实现放到子类中实现。
例子:比如炒饭,炒饭的流程就是,但是有的客人要求咸一点,有的客人要求蛋多一点,这就导致具体的炒饭会有所不同。因此我们将加饭的量,鸡蛋的量,配料的量,和翻炒时间都放到子类(或实现接口的类)中去实现,而将流程放到抽象类/接口中,通过厨师(Director)来将饭炒好给客人品尝。
以下以上面的炒饭为例子:
public class 建造者模式 { public static void main(String[] args) { ChaofanDirector cd = new ChaofanDirector(); Chaofan chaofan = cd.constructChaofan(new MoreEggChaofanBuilder()); chaofan.print(); chaofan = cd.constructChaofan(new SaltyChaofanBuilder()); chaofan.print(); } } enum Size { LITTLE, NORMAL, MUCH }; //Product class Chaofan { public Size rice; //这里节省空间就不写getters/setters public Size egg; public Size spices; public Size stirfly; public void print() { System.out.println(rice + " Rice, " + egg + " Egg, " + spices + " Spices, " + stirfly + " Stirfly"); } } //Builder interface ChaofanBuilder { void addRice(); void addEgg(); void addSpices(); void stirFly(); Chaofan buildChaofan(); } //ConcreteBuilder class SaltyChaofanBuilder implements ChaofanBuilder { Chaofan chaofan; public SaltyChaofanBuilder() { chaofan = new Chaofan(); } public void addRice() { chaofan.rice = Size.NORMAL; } public void addEgg() { chaofan.egg = Size.NORMAL; } public void addSpices() { chaofan.spices = Size.MUCH; } public void stirFly() { chaofan.stirfly = Size.NORMAL; } public Chaofan buildChaofan() { return chaofan; } } class MoreEggChaofanBuilder implements ChaofanBuilder { Chaofan chaofan; public MoreEggChaofanBuilder() { chaofan = new Chaofan(); } public void addRice() { chaofan.rice = Size.NORMAL; } public void addEgg() { chaofan.egg = Size.MUCH; } public void addSpices() { chaofan.spices = Size.NORMAL; } public void stirFly() { chaofan.stirfly = Size.NORMAL; } public Chaofan buildChaofan() { return chaofan; } } //Director class ChaofanDirector { public Chaofan constructChaofan(ChaofanBuilder cb) { cb.addRice(); cb.addEgg(); cb.addSpices(); cb.stirFly(); return cb.buildChaofan(); } }
分析:我们要的炒饭就是Chaofan类,即类图中的Product,炒饭的流程都是一样的,该流程放在了Builder即ChaofanBuilder类中,而客人要求的炒饭是不同的,具体的炒饭实现方式放在了ConcreteBuilder即MoreEggChaofanBuilder和SaltyChaofanBuilder中,而Director即ChaofanDirector就是厨师,负责把饭炒好,然后给客人品尝。
总结:将流程放到接口中,具体细节放到子类中,通过Director创建出Product。
建造者模式(Builder)的更多相关文章
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 建造者模式(Builder)-宏观的使用角度
建造者模式(Builder) 建造者模式是用来解决产品对象的创建过程是由多个零件组成的情况,这些零件与产品本身是组合关系,也就是部分与整体,这些零件的创建顺序,还有一些创建中的逻辑,都是稳定的,可以封 ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- 建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
- 建造者模式(Builder)——从组装电脑开始
建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...
- 设计模式—建造者模式(Builder)
title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
随机推荐
- JavaScript设计模式——前奏(封装和信息隐藏)
前面一篇讲了js设计模式的前奏,包括接口的讲解.. 三:封装和信息隐藏: 信息隐藏用来进行解耦,定义一些私有的数据和方法. 封装是用来实现信息隐藏的技术,通过闭包实现私有数据的定义和使用. 接口在这其 ...
- maven自建仓库 Return code : 405
maven自建仓库jar包上传: jar包上传可以采用在自建仓库上系统上传以及通过配置maven setting.xml以及pom.xml上传. maven通过配置上传需要用户名密码以及maven仓库 ...
- MySql 的数据储存引擎
1.存储引擎是什么? Mysql中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...
- http://blog.csdn.net/hitmediaman/article/details/6636402
http://blog.csdn.net/hitmediaman/article/details/6636402
- ora-14400插入的分区关键字未映射到任何分区---oracle数据库表过期问题
楼主解决这个问题ora-14400插入的分区关键字未映射到任何分区,其原因是:分区表过期. 通过使用sql直接修改Date类型的字段可以证实,修改成过期以后的时间出现下列提示,修改成过期之前的则可以. ...
- python 代码片段24
#coding=utf-8 #内部类 class MyClass(object): class InnerClass: pass # 正则表达式 # 通过re模块来访问 import re m=re. ...
- HDU5823 : color II
每种颜色的点集肯定是独立集,因此可以通过$O(2^n)$枚举每个集合判断出每个集合是否只需要一种颜色即可染色. 设$f[i][S]$表示$i$种颜色覆盖$S$这个集合的方案数,假定两个集合可以相交,那 ...
- 只有火狐识别的css
写在css里写只有火狐可以识别,其他浏览器不行. 就算写在@media only screen and (min-width: 960px) and (max-width: 1200px){ 里面也行 ...
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...
- 20145304 Java第九周学习报告
20145304<Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是Java联机数据库的标准规范.定义了 ...