⑥ 设计模式的艺术-06.建造者(Builder)模式
场景
我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样一个问题需要处理:
装配这些子组件是不是有个步骤问题?
实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
建造模式的本质
分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。
也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
代码示例
AirShip.java
- public class AirShip {
- private OrbitalModule orbitalModule;//轨道舱
- private Engine engine;//发动机
- private EscapeTower escapeTower;//逃逸塔
- public void launch(){
- System.out.println("发射!");
- }
- public OrbitalModule getOrbitalModule() {
- return orbitalModule;
- }
- public void setOrbitalModule(OrbitalModule orbitalModule) {
- this.orbitalModule = orbitalModule;
- }
- public Engine getEngine() {
- return engine;
- }
- public void setEngine(Engine engine) {
- this.engine = engine;
- }
- public EscapeTower getEscapeTower() {
- return escapeTower;
- }
- public void setEscapeTower(EscapeTower escapeTower) {
- this.escapeTower = escapeTower;
- }
- }
- class OrbitalModule{
- private String name;
- public OrbitalModule(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- class Engine {
- private String name;
- public Engine(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- class EscapeTower{
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public EscapeTower(String name) {
- super();
- this.name = name;
- }
- }
AirShipBuilder.java
- public interface AirShipBuilder {
- Engine builderEngine();
- OrbitalModule builderOrbitalModule();
- EscapeTower builderEscapeTower();
- }
AirShipDirector.java
- public interface AirShipDirector {
- /**
- * 组装飞船对象
- * @return
- */
- AirShip directAirShip();
- }
SxtAirShipBuilder.java
- public class SxtAirShipBuilder implements AirShipBuilder {
- //StringBuilder, 以后学习XML解析中,JDOM库中的类:DomBuilder,SaxBuilder
- @Override
- public Engine builderEngine() {
- System.out.println("构建发动机!");
- return new Engine("发动机!");
- }
- @Override
- public EscapeTower builderEscapeTower() {
- System.out.println("构建逃逸塔");
- return new EscapeTower("逃逸塔");
- }
- @Override
- public OrbitalModule builderOrbitalModule() {
- System.out.println("构建轨道舱");
- return new OrbitalModule("轨道舱");
- }
- }
SxtAirshipDirector.java
- public class SxtAirshipDirector implements AirShipDirector {
- private AirShipBuilder builder;
- public SxtAirshipDirector(AirShipBuilder builder) {
- this.builder = builder;
- }
- @Override
- public AirShip directAirShip() {
- Engine e = builder.builderEngine();
- OrbitalModule o = builder.builderOrbitalModule();
- EscapeTower et = builder.builderEscapeTower();
- //装配成飞船对象
- AirShip ship = new AirShip();
- ship.setEngine(e);
- ship.setEscapeTower(et);
- ship.setOrbitalModule(o);
- return ship;
- }
- }
Client.java
- public class Client {
- public static void main(String[] args) {
- AirShipDirector director = new SxtAirshipDirector(new SxtAirShipBuilder());
- AirShip ship = director.directAirShip();
- System.out.println(ship.getEngine().getName());
- ship.launch();
- }
- }
开发中应用场景
StringBuilder类的append方法
SQL中的PreparedStatement
JDOM中,DomBuilder、SAXBuilder
⑥ 设计模式的艺术-06.建造者(Builder)模式的更多相关文章
- 设计模式C++描述----07.建造者(Builder)模式
一. 概述 Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开 来,这样做的好处就是通过一步 ...
- Java设计模式-建造者(Builder)模式
目录 由来 使用 1. 定义抽象 Builder 2. 定义具体 Builder类 3. 定义具体 Director类 4. 测试 定义 文字定义 结构图 优点 举例 @ 最近在看Mybatis的源码 ...
- Android设计模式源码解析之Builder模式
https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/builder/mr. ...
- 建造者(Builder)模式
建造者模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 产品的 ...
- 《图解设计模式》读书笔记3-3 Builder模式
目录 示例程序 类图 代码 角色 思路拓展 谁知道什么 构造和实现分离 和Template Method模式的区别和联系? Builder模式即建造者模式,利用这个模式可以组装具有复杂结构的实例. 示 ...
- Android 建造者(Builder)模式
关于 Builder 模式 详述:http://blog.csdn.net/jjwwmlp456/article/details/39890699 先来张图 看到 Android 中 使用了 Bui ...
- 设计模式--建造者(Builder)模式
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示 --<设计模 ...
- 设计模式C++描述----06.适配器(Adapter)模式
一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...
- 设计模式的征途—6.建造者(Builder)模式
建造者模式又称为生成器模式,它是一种较为复杂.使用频率也相对较低的创建型模式.建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品.因为,没有人买车会只买一个方向盘或者轮胎,大 ...
随机推荐
- HDU 5655 CA Loves Stick 水题
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5656 CA Loves Stick Accepts: 381 Submissions: 3204 ...
- BETA版本前冲刺准备
[团队概要] 团队项目名:小葵日记 团队名:日不落战队 队员及角色: 队员 角色 备注 安琪 前端工程师 队长 佳莹 前端工程师 智慧 后端工程师 章鹏 后端工程师 语恳 UI设计师 炜坤 前端工程师 ...
- golang中的检验hash
1.对字符串进行hash 大家可以看一下, SHA1 Hashes Go by Example写道: The pattern for generating a hash is sha1.New(), ...
- Privoxy
Privoxy 前沿: 这个玩意我以前都没听说过,今天在别人的帮助下试了试,只想说:谁还能阻挡我,我就是要USA....ps:在此感谢每一个帮助我的人 介绍: Privoxy是一款带过滤功能的代理服务 ...
- Hibernate 中 load() 和 get() 的区别
get 和 load 方式都是是根据 id 取得一个记录.下边详细说一下 get 和 load 的不同,因为有些时候为了对比也会把 find 加进来. 1.从返回结果上对比: load 方式检索不到的 ...
- JMeter脚本增强之参数化
JMeter测试脚本录制或者编写,在Web应用和App上的操作方式可能有一点点区别(其实也差不多,哈哈),但是当脚本录制好了之后,对测试脚本的强化,包括参数化.关联.文本检查.集合点设置,甚至再往后的 ...
- BZOJ4915 简单的数字题
不妨设a1<a2<a3<a4.显然第一问的答案是4,满足a1+a4=a2+a3,a1+a2|a3+a4,a1+a3|a2+a4.容易发现将其同时扩大k倍是仍然满足条件的,于是考虑gc ...
- Luogu4897 【模板】最小割树
没事干写一发模板. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib& ...
- Spring Batch @SpringBatchTest 注解
Spring Batch 提供了一些非常有用的工具类(例如 JobLauncherTestUtils 和 JobRepositoryTestUtils)和测试执行监听器(StepScopeTestEx ...
- BZOJ3262:陌上花开 & 洛谷3810:三维偏序——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3262 https://www.luogu.org/problemnew/show/3810 Desc ...