概念:

  将一个复杂对象的构建与它的表示分离。使得同样构建过程可以创建不同表示
适用场景:

  1. 一个对象有很多属性的情况下
  2. 想把复杂的对象创建和使用分离

优点:

  封装性好,扩展性好

详解:
  工厂模式注重把这个产品创造出来即可,而建造者更关心创建的细节,当创建一个对象需要使用很多步骤去完成的时候,我们可以考虑建造者模式,当创建一个对象比较简单的时候,我们就可以使用工厂模式。通俗一点来理解,建造者模式更像是专门定做一个东西,还是拿上篇博客的例子来说,iterator()作为一个工厂方法,它是可以有不同的厂家,但是呢,它完成的都是遍历的功能,而建造者更像是你买一个戒指,你不仅仅要求它能戴在手上,更加希望你的名字被刻在上面这样。就是关注到产品细节的就可以用建造者模式。如果你还不理解,那我们来看下面的代码:

class Test{
public static void main(String[] args) {
StringBuilder s=new StringBuilder("你好").append(",我现在在研究").append("建造者模式").append("希望能有所收获.");
System.out.println(s); }
}

运行结果如下:

上面可以链式调用append()方法,在UML图(部分)里可以看见

拿其中一个append的方法就是

@Override
public StringBuilder append(char c) {
super.append(c);
return this;
}

StringBuilder的父类是AbstractStringBuilder抽象类。所以来到AbstractStringBuilder里面的append方法

@Override
public AbstractStringBuilder append(char c) {
ensureCapacityInternal(count + 1);
value[count++] = c;
return this;
}

  可以看见是要插入一个字符串,要先扩容,再在把这个值加入到value数组中。在这里多说一嘴,这也是StringBuilder,StringBuffer和String类最大的区别,在String底层是一个用final修饰的值不可变的数组,而AbstractStringBuilder中的数组是“值可变”的,下面是AbstractStringBuilder扩容的源码

private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}

  也就是原来的数组拷贝到一个新的长度数组里面。这虽然原来的数组也是不可变的,但是放在JVM底层StringBuilder是只改了这个对象指向的区域里面的值,并没有改这个对象的指向区域。而String是直接new一个新对象,然后修改String旧对象指向的地方,来达到改值的操作。

总结:
  扯远了,现在回到建造者模式,建造者最常用的其实是想上面Test类中的链式调用,因为我可以订做这个产品的具体细节,你再给我多少个append()或者一些其他方法调用,我返回的还是StringBuilder这个对象,也就是这个产品不变,但是里面的细节我有要求你给我做成什么样的。可以和之前的工厂模式对比着看,会更有体会。

结合JDK源码看设计模式——建造者模式的更多相关文章

  1. 结合JDK源码看设计模式——桥接模式

    前言: 在我们还没学习框架之前,肯定都学过JDBC.百度百科对JDBC是这样介绍的[JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Jav ...

  2. 结合JDK源码看设计模式——原型模式

    定义: 指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.不需要知道任何创建的细节,不调用构造函数适用场景: 类初始化的时候消耗较多资源 new产生的对象需要非常繁琐的过程 构造函数比较 ...

  3. 结合JDK源码看设计模式——模板方法模式

    前言: 相信很多人都听过一个问题:把大象关进冰箱门,需要几步? 第一,把冰箱门打开:第二,把大象放进去:第三,把冰箱门关上.我们可以看见,这个问题的答案回答的很有步骤.接下来我们介绍一种设计模式--模 ...

  4. 结合JDK源码看设计模式——迭代器模式

    前言: Iterator翻译过来就是迭代器的意思.在前面的工厂模式中就介绍过了iterator,不过当时介绍的是方法,现在从Iterator接口的设计来看,似乎又是一种设计模式,下面我们就来讲讲迭代器 ...

  5. 结合JDK源码看设计模式——策略模式

    前言: 现在电商已经成为我们生活中不可或缺的购物渠道,同时各大商家会针对不同的时间做出不同的折扣,这在我们看来就是一种营销手段,也是一种策略,今天我们就来讲讲JDK中的策略模式是怎么样的. 一.定义 ...

  6. 结合JDK源码看设计模式——组合模式

    前言: 相信大家都打开过层级很多很多的文件夹.如果把第一个文件夹看作是树的根节点的话,下面的子文件夹就可以看作一个子节点.不过最终我们寻找的还是文件夹中的文件,文件可以看做是叶子节点.下面我们介绍一种 ...

  7. 结合JDK源码看设计模式——单例模式

    定义: 保证一个类仅有一个实例,并提供一个全局访问点 适用场景: 确保任何情况下这个对象只有一个实例 详解: 私有构造器 单利模式中的线程安全+延时加载 序列化和反序列化安全, 防止反射攻击 结合JD ...

  8. 结合JDK源码看设计模式——简单工厂、工厂方法、抽象工厂

    三种工厂模式的详解: 简单工厂模式: 适用场景:工厂类负责创建的对象较少,客户端只关心传入工厂类的参数,对于如何创建对象的逻辑不关心 缺点:如果要新加产品,就需要修改工厂类的判断逻辑,违背软件设计中的 ...

  9. 结合JDK源码看设计模式——享元模式

    前言 在说享元模式之前,你一定见到过这样的面试题 public class Test { public static void main(String[] args) { Integer a=Inte ...

随机推荐

  1. 四、蛋炒饭(Egg fried rice)

    蛋炒饭,是一种常见菜肴.最早的记载见于1972年湖南长沙马王堆汉墓出土的竹简上有关"卵火高"的资料.经专家考证,"卵熇"是一种用黏米饭加鸡蛋制成的食品.有人推断 ...

  2. linux mysql 安装

    操作系统 Centos 7.2以上版本 操作系统 centos 7.2以上版本 mysql 版本 mysql-5.7.23-el7-x86_64.tar.gz 1.1 安装准备 1.  创建安装文件存 ...

  3. Conda命令指标

    一.Conda相关指令 # 查看当前环境下已安装的包 conda list # 查看某个指定环境的已安装包 conda list -n tensorflow # 查找package信息 conda s ...

  4. Unbuntu 16.04 英文环境安装中文输入法

    ubuntu 16.04 使用的是ibus输入系统,没有预装中文输入法,你要自己安装一下.以中文拼音输入法为例:1.sudo apt install ibus-pinyin2.sudo apt ins ...

  5. 小程序组件化框架 WePY 在性能调优上做出的探究

    作者:龚澄 导语 性能调优是一个亘古不变的话题,无论是在传统H5上还是小程序中.因为实现机制不同,可能导致传统H5中的某些优化方式在小程序上并不适用.因此必须另开辟蹊径找出适合小程序的调估方式. 本文 ...

  6. 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制

    今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...

  7. Javascript中的this关键字用法详解

    在javascript里面,this是一个特殊的对象,它不像其他编程语言那样,是存储在实例中的值,直接指向此实例. 而是作为一个单独的指针,在不同的情况之下,指向不同的位置,这也是为什么我们会将它搞混 ...

  8. 使用Task

    http://www.cnblogs.com/Charltsing/p/taskpoolthread.html task默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...

  9. nvidia-docker+cuda8.0+ubuntu16.04

    nvidia-docker安装 如果之前安装过docker1.0版本,需要先删掉该版本和之前创建的容器 docker volume ls -q -f driver=nvidia-docker | xa ...

  10. 【SQL进阶】03.执行计划之旅1 - 初探

    听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. S ...