文章目录

  • 1 Builder 模式的核心思想
  • 2 第一种 Builder 模式
  • 3 第一种模式的困惑
  • 4 第二种 Builder 模式
  • 5 第二种 Builder 模式见解
  • 6 参考

1 Builder 模式的核心思想

  • Builder 模式注重过程,它关注与产品的组装过程
  • 而抽象工厂注重结果,是对结果的抽象,客户端不知道过程

2 第一种 Builder 模式

  • 首先定义一个抽象的 Builder 类:规定了子类必须实例化的方法
public abstract class PersonBuilder {Person person;public abstract void buildHead();public abstract void buildBody();public abstract void buildArmLeft();public abstract void buildArmRight();public abstract void buildLegLeft();public abstract void buildLegRight();
}
  • 然后实例化一个具体的 Builder 实例
public class PersonThinBuilder extends PersonBuilder {public PersonThinBuilder() {person = new Person();}@Overridepublic void buildHead() {person.setHead("小头");}// 其它代码略
  • 最后实例化一个 Director(指挥者),抽象创建过程
public class PersonDirector {private PersonBuilder pb;public PersonDirector(PersonBuilder pb) {this.pb = pb;}//这里就是创建者模式的核心创建过程,但是这个确定的过程完全可以直接放在 PersonBuilder 类中啊public Person createPerson() {pb.buildArmLeft();pb.buildArmRight();pb.buildBody();pb.buildHead();pb.buildLegLeft();pb.buildLegRight();return pb.person;}
}
@Test
public void test() {//客户端程序PersonDirector pd = new PersonDirector(new PersonThinBuilder());Person p = pd.createPerson();System.out.println(p);
}

3 第一种模式的困惑

  • 这个模式在指挥者中定义了产品创建的过程,完全可以不需要这个指挥者,将这个过程直接放入创建者中。这各指挥者起什么作用呢?
  • 我觉得这一种模式就是抽象工厂(PersonBuilder )和模板模式(createPerson)的结合体,而且这个模板模式的代码很冗余
  • 这种模式在客户端仍然没体现过程

4 第二种 Builder 模式

public class PersonBuilder0 {private Person person;public PersonBuilder0() {person = new Person();}public PersonBuilder0 buildBody(String body) {person.setBody(body);return this;}public PersonBuilder0 buildHead(String head) {person.setHead(head);return this;}public PersonBuilder0 buildArmLeft(String leftArm) {person.setArmLeft(leftArm);return this;}public PersonBuilder0 buildArmRight(String rightArm) {person.setArmRight(rightArm);return this;}public PersonBuilder0 buildLegLeft(String leftLeg) {person.setLegLeft(leftLeg);return this;}public PersonBuilder0 buildLegRight(String rightLeg) {person.setLegRight(rightLeg);return this;}public Person build() {return person;}
}
@Test
public void test() {Person p = new PersonBuilder0().buildArmLeft("大左胳膊").buildArmLeft("小右胳膊").build();System.out.println(p);//没有手和头
}

5 第二种 Builder 模式见解

  • 很明显第二种模式客户端的是很体现过程的
  • 而且灵活些也很强,客户端可以任意的组装,形成不同的产品
  • 并且如果 Person 中的组件很复杂,也可以结合抽象工厂模式建立一个 Person 组件的抽象工厂,客户通过抽象工厂方便的选择想要的组件

6 参考

大话设计模式
Head First 设计模式
设计模式
github 源码地址

设计模式 —— Builder 模式相关推荐

  1. 设计模式-Builder模式

    目录 一个例子(做汤) 人工做汤 机器做汤(使用Builder模式) 优缺点 优点 缺点 Builder模式属于创建型模式. 它是将一个复杂对象的构建过程隐藏起来,让使用者只关系自己要生成什么样的对象 ...

  2. 设计模式--builder 模式

    设计模式–builder 模式 说明 @author JellyfishMIX - github / blog.jellyfishmix.com LICENSE GPL-2.0 本文默认已经知道了 b ...

  3. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  4. Java 常用设计模式 -- Builder模式

    Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...

  5. java的设计模式 - Builder模式

    Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...

  6. GOF 设计模式 builder模式笔记

    Builder(生成器) 意图:将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示. 在以下情况使用Builder模式 当创建复杂的对象应该独立于该对象的组成部分以及它们的装配 ...

  7. Java设计模式-Builder模式

    Builder模式是将一个复杂对象的创建和表示分离,使同样的创建过程可以创建不同的表示.它属于建造类模式. 一般来说,如果一个对象的创建比较复杂,超出了构造方法所能包含的范围,就可以使用工厂模式和Bu ...

  8. 设计模式 builder模式

    也是属于对象创建类模式.使用的一般情况是,需要完成一个复杂的对象创建工作,工作通常由各个部分的子对象用一定的算法构成,比如step1,step2,step3,步骤内部常常发生剧烈的变化,但是组合在一起 ...

  9. 设计模式-Builder模式(构建者模式)

    目录 构建者模式是什么? 为什么要用构建者模式? 构建者模式是什么? 简单来说,就是用于组装具有复杂结构的实例的模式. 什么意思呢?先来看个例子,比如现在有一个类TextBuilder用来创建一个文本 ...

最新文章

  1. 【ASP.NET Core】ASP.NET Core 依赖注入
  2. 大数据Scala编程.问题集(02)
  3. ArcGIS Engine中空间参照(地理坐标)相关方法总结
  4. rabbitmq的启动命令和springboot整合使用rabbitmq
  5. centos操作系统搭建Lamp环境(apache php mysql)
  6. SharePoint工作流开发点滴(2) - 开发第一个SharePiont工作流: HelloWorldSequential 的注意事项...
  7. Asp.net core中Migration工具使用的交流分享
  8. 【牛客 - 283H】图论一顿套模板(思维转化,Dijkstra)
  9. ip网络基础知识及原理_关于网络测试的5个命令
  10. 九个PHP很有用的功能
  11. java 爬虫_Java爬虫可以非常溜
  12. Mathematic的学习打卡day 8
  13. Poi 为word 添加页眉 获取页眉
  14. 最具创新价值人工智能产品 Imagination PowerVR NNA再获殊荣
  15. Java 服务接入 OpenTracing(2) -- Java 项目快速接入 OpenTracing
  16. 振荡中医学习感悟——姥姥的咳嗽
  17. 用python写一个自动注册脚本_js自己写脚本自动操作注册插件基于chrome浏览器
  18. android沉浸式状态栏、fitsSystemWindows、标题栏折叠
  19. stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果
  20. 腾讯一年投出1100亿:押注了什么?错过了什么?

热门文章

  1. python记忆式键入,在Python编程模式下输入命令”print(100+200)“执行的结果是()
  2. linux RAID管理与恢复误删除文件
  3. 【圣诞树代码】送她六棵圣诞树,祝她圣诞快乐~(送女朋友必备!)
  4. 关于Redis的远程连接 Connection: Disconnect on error 问题
  5. list()与tolist()的区别
  6. RocketMQ实战疑问和原理解答(更新至Q9)
  7. MonoRail例子(入门篇)
  8. 基于Nano Pi NEO4开发板的AS项目开发
  9. 第六章 网络编程——SOCKET 开发
  10. 《炒股的智慧》--陈江挺