java设计模式之建造者模式

负重前行的小牛 2020-11-11 23:28:03
java 设计 模式 建造


建造者模式的定义:

建造者模式将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型设计模式。

对于用户而言,使用建造者模式只需指定需要创建的类型就可以获得对象,创建过程及细节不需要了解。根据建造者模式的定义可以简单的理解为两层含义。

  1. 构建与表示分离:构建代表对象创建,表示代表对象行为、方法,也就是将对象的创建与行为进行分离(对应到java代码中,其实就是使用接口规定行为,然后由具体的实现类进行构建)。
  2. 创建不同的表示:也就是具备同样的行为,但是却由于构建的行为顺序不同或其他原因可以构建出不同的表示。

建造者模式的应用场景:

  • 相同的方法,不同的执行顺序,产生不同的结果。
  • 多个部件或零件,都可以装配到对象中,但是产生的结果不同。
  • 产品类非常复杂,或者产品类中不同的调用顺序产生不同的结果。
  • 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。

建造者模式的UML类图:

 

 

 由上图可以看到,建造者模式主要包含4给角色:

  1. 产品(Product):要创建的产品类对象。
  2. 抽象建造者(IBuilder):建造者的抽象类,规范产品对象的各个组成部分的创建,一般由子类实现具体的创建过程。
  3. 建造者(ConcreteBuilder):具体的Builder类,根据实际的业务逻辑,具体化对象的各个组成部分的创建。
  4. 调用者(Director):调用者不设计具体的产品信息,只负责保证对象各部分完整创建或者按某种顺序创建。在类图中,client相当于调用者的角色。

建造者模式在StringBuilder中运用:

先看看如下代码的执行结果:

 

 调整下顺序的执行结果:

 

 你会发现通过调整执行顺序就能实现不同的结果。

 

 查看StringBuilder的源码,会发现StringBuilder继承AbstractStringBuilder,所以在StringBuilder中,产品对应的就String对象,抽象建造者对应的是AbstractStringBuilder,建造者对应的是StringBuilder,调用者就是

Test测试类,需要主要的,常见的创建着一般是用builder实现最终产品的创建,但是StringBuilder由于是来创建String对象的,所以命名为toString,因为java中任何对象转成字符串都是toString方法,这是约定熟成的。

 

 建造者模式与工厂模式的区别:

  • 建造者模式更加注重方法的调用顺序,工厂模式注重创建对象。
  • 创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,而工厂模式创建的对象都一样。
  • 关注点不一样,工厂模式只需要把对象创建出来就可以了,而建造者模式不仅要创建出对象,还要关注对象由哪些部件组成。
  • 建造者模式根据建造过程中的顺序不一样,可以创建各种不同的对象。

建造者模式的有点:

  • 封装性好,构建和表示分离。
  • 扩展性好,建造类之间独立,在一定程度上解耦。
  • 便于控制细节,建造者可以对创建过程逐步细化,而不对其他模块产生影响。

建造者模式的缺点:

  • 需要多创建一个IBuilder对象。
  • 如果产品内部发生变化,则创建者也要同步修改,维护成本较大。
版权声明
本文为[负重前行的小牛]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/liu-yi/p/13961683.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云