场景

我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样一个问题需要处理:

装配这些子组件是不是有个步骤问题?

实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。

建造模式的本质

分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。

由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。

也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

代码示例

AirShip.java

  1. public class AirShip {
  2.  
  3. private OrbitalModule orbitalModule;//轨道舱
  4. private Engine engine;//发动机
  5. private EscapeTower escapeTower;//逃逸塔
  6.  
  7. public void launch(){
  8. System.out.println("发射!");
  9. }
  10.  
  11. public OrbitalModule getOrbitalModule() {
  12. return orbitalModule;
  13. }
  14. public void setOrbitalModule(OrbitalModule orbitalModule) {
  15. this.orbitalModule = orbitalModule;
  16. }
  17. public Engine getEngine() {
  18. return engine;
  19. }
  20. public void setEngine(Engine engine) {
  21. this.engine = engine;
  22. }
  23. public EscapeTower getEscapeTower() {
  24. return escapeTower;
  25. }
  26. public void setEscapeTower(EscapeTower escapeTower) {
  27. this.escapeTower = escapeTower;
  28. }
  29. }
  30.  
  31. class OrbitalModule{
  32. private String name;
  33.  
  34. public OrbitalModule(String name) {
  35. this.name = name;
  36. }
  37.  
  38. public String getName() {
  39. return name;
  40. }
  41.  
  42. public void setName(String name) {
  43. this.name = name;
  44. }
  45. }
  46.  
  47. class Engine {
  48. private String name;
  49.  
  50. public Engine(String name) {
  51. this.name = name;
  52. }
  53.  
  54. public String getName() {
  55. return name;
  56. }
  57.  
  58. public void setName(String name) {
  59. this.name = name;
  60. }
  61. }
  62.  
  63. class EscapeTower{
  64. private String name;
  65.  
  66. public String getName() {
  67. return name;
  68. }
  69.  
  70. public void setName(String name) {
  71. this.name = name;
  72. }
  73.  
  74. public EscapeTower(String name) {
  75. super();
  76. this.name = name;
  77. }
  78. }

AirShipBuilder.java

  1. public interface AirShipBuilder {
  2. Engine builderEngine();
  3. OrbitalModule builderOrbitalModule();
  4. EscapeTower builderEscapeTower();
  5. }

AirShipDirector.java

  1. public interface AirShipDirector {
  2. /**
  3. * 组装飞船对象
  4. * @return
  5. */
  6. AirShip directAirShip();
  7. }

SxtAirShipBuilder.java

  1. public class SxtAirShipBuilder implements AirShipBuilder {
  2. //StringBuilder, 以后学习XML解析中,JDOM库中的类:DomBuilder,SaxBuilder
  3. @Override
  4. public Engine builderEngine() {
  5. System.out.println("构建发动机!");
  6. return new Engine("发动机!");
  7. }
  8.  
  9. @Override
  10. public EscapeTower builderEscapeTower() {
  11.  
  12. System.out.println("构建逃逸塔");
  13. return new EscapeTower("逃逸塔");
  14. }
  15.  
  16. @Override
  17. public OrbitalModule builderOrbitalModule() {
  18. System.out.println("构建轨道舱");
  19. return new OrbitalModule("轨道舱");
  20. }
  21.  
  22. }

SxtAirshipDirector.java

  1. public class SxtAirshipDirector implements AirShipDirector {
  2.  
  3. private AirShipBuilder builder;
  4.  
  5. public SxtAirshipDirector(AirShipBuilder builder) {
  6. this.builder = builder;
  7. }
  8.  
  9. @Override
  10. public AirShip directAirShip() {
  11. Engine e = builder.builderEngine();
  12. OrbitalModule o = builder.builderOrbitalModule();
  13. EscapeTower et = builder.builderEscapeTower();
  14.  
  15. //装配成飞船对象
  16. AirShip ship = new AirShip();
  17. ship.setEngine(e);
  18. ship.setEscapeTower(et);
  19. ship.setOrbitalModule(o);
  20.  
  21. return ship;
  22. }
  23.  
  24. }

Client.java

  1. public class Client {
  2. public static void main(String[] args) {
  3.  
  4. AirShipDirector director = new SxtAirshipDirector(new SxtAirShipBuilder());
  5.  
  6. AirShip ship = director.directAirShip();
  7.  
  8. System.out.println(ship.getEngine().getName());
  9.  
  10. ship.launch();
  11. }
  12. }

开发中应用场景

StringBuilder类的append方法

SQL中的PreparedStatement

JDOM中,DomBuilder、SAXBuilder

⑥ 设计模式的艺术-06.建造者(Builder)模式的更多相关文章

  1. 设计模式C++描述----07.建造者(Builder)模式

    一. 概述 Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开 来,这样做的好处就是通过一步 ...

  2. Java设计模式-建造者(Builder)模式

    目录 由来 使用 1. 定义抽象 Builder 2. 定义具体 Builder类 3. 定义具体 Director类 4. 测试 定义 文字定义 结构图 优点 举例 @ 最近在看Mybatis的源码 ...

  3. Android设计模式源码解析之Builder模式

    https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/builder/mr. ...

  4. 建造者(Builder)模式

    建造者模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 产品的 ...

  5. 《图解设计模式》读书笔记3-3 Builder模式

    目录 示例程序 类图 代码 角色 思路拓展 谁知道什么 构造和实现分离 和Template Method模式的区别和联系? Builder模式即建造者模式,利用这个模式可以组装具有复杂结构的实例. 示 ...

  6. Android 建造者(Builder)模式

    关于 Builder 模式 详述:http://blog.csdn.net/jjwwmlp456/article/details/39890699 先来张图 看到 Android  中 使用了 Bui ...

  7. 设计模式--建造者(Builder)模式

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示                                                         --<设计模 ...

  8. 设计模式C++描述----06.适配器(Adapter)模式

    一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...

  9. 设计模式的征途—6.建造者(Builder)模式

    建造者模式又称为生成器模式,它是一种较为复杂.使用频率也相对较低的创建型模式.建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品.因为,没有人买车会只买一个方向盘或者轮胎,大 ...

随机推荐

  1. HDU 5655 CA Loves Stick 水题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5656 CA Loves Stick Accepts: 381   Submissions: 3204 ...

  2. BETA版本前冲刺准备

    [团队概要] 团队项目名:小葵日记 团队名:日不落战队 队员及角色: 队员 角色 备注 安琪 前端工程师 队长 佳莹 前端工程师 智慧 后端工程师 章鹏 后端工程师 语恳 UI设计师 炜坤 前端工程师 ...

  3. golang中的检验hash

    1.对字符串进行hash 大家可以看一下, SHA1 Hashes Go by Example写道: The pattern for generating a hash is sha1.New(), ...

  4. Privoxy

    Privoxy 前沿: 这个玩意我以前都没听说过,今天在别人的帮助下试了试,只想说:谁还能阻挡我,我就是要USA....ps:在此感谢每一个帮助我的人 介绍: Privoxy是一款带过滤功能的代理服务 ...

  5. Hibernate 中 load() 和 get() 的区别

    get 和 load 方式都是是根据 id 取得一个记录.下边详细说一下 get 和 load 的不同,因为有些时候为了对比也会把 find 加进来. 1.从返回结果上对比: load 方式检索不到的 ...

  6. JMeter脚本增强之参数化

    JMeter测试脚本录制或者编写,在Web应用和App上的操作方式可能有一点点区别(其实也差不多,哈哈),但是当脚本录制好了之后,对测试脚本的强化,包括参数化.关联.文本检查.集合点设置,甚至再往后的 ...

  7. BZOJ4915 简单的数字题

    不妨设a1<a2<a3<a4.显然第一问的答案是4,满足a1+a4=a2+a3,a1+a2|a3+a4,a1+a3|a2+a4.容易发现将其同时扩大k倍是仍然满足条件的,于是考虑gc ...

  8. Luogu4897 【模板】最小割树

    没事干写一发模板. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib& ...

  9. Spring Batch @SpringBatchTest 注解

    Spring Batch 提供了一些非常有用的工具类(例如 JobLauncherTestUtils 和 JobRepositoryTestUtils)和测试执行监听器(StepScopeTestEx ...

  10. BZOJ3262:陌上花开 & 洛谷3810:三维偏序——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3262 https://www.luogu.org/problemnew/show/3810 Desc ...