概念:

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

  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这个对象,也就是这个产品不变,但是里面的细节我有要求你给我做成什么样的。可以和之前的工厂模式对比着看,会更有体会。

最新文章

  1. 类EF框架Chloe.ORM升级:只为更完美
  2. jquery 的一些基本操作
  3. python3.5.2本地环境搭建
  4. 通过Dockerfile建立.NET Core mvc Image
  5. java面试
  6. ruby -- 进阶学习(三)Strong Parameters在rail3.0和4.0中的区别
  7. LoadCursor 函数
  8. C#中多线程的简单应用
  9. WebStorm 快捷键收藏
  10. AQuery简介:jQuery for Android
  11. Codeforces 245H Queries for Number of Palindromes
  12. Qt的“undefined reference to `vtable for”错误解决(手动解决,加深理解)
  13. [HMLY]3.如何使用Xcode Targets管理开发和生产版本?
  14. Bloom Filter的基本原理和变种
  15. 内功心法 -- java.util.ArrayList<E> (2)
  16. 【Alpha】阶段 第六次 Scrum Meeting
  17. SpringCloud分布式微服务搭建(三)
  18. jQuery 第六章 jQuery在Ajax应用
  19. 【感悟】一次不太好的寻找bug的体验,RecyclerView
  20. VS2017报错 未能加载文件或程序集”Oracle.DataAccess, Version=2.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"或它的某一个依赖项。试图加载格式不正确的程序

热门文章

  1. 解析jsonObject,赋给指定的对象
  2. SQL插入数据--数据中的某一列来自本表中的数据
  3. python MVC、MTV 框架介绍 Django 模板系统常用语法
  4. LinkedBlockingQueue 注记
  5. FFmpeg 结构体学习(四): AVFrame 分析
  6. 查看和修改Linux服务器的时区和时间
  7. [SQL]LeetCode196. 删除重复的电子邮箱 | Delete Duplicate Emails
  8. [Swift]LeetCode406. 根据身高重建队列 | Queue Reconstruction by Height
  9. [Swift]LeetCode629. K个逆序对数组 | K Inverse Pairs Array
  10. 封装nodeJS中 $on $emit $off 事件