建造者模式(Builder Pattern)

创建者模式又叫建造者模式属于创建型模式

使用同样的构建过程,根据需要创建不同的表示。这种设计模式隐藏了具体的创建过程,将复杂对象的创建过程加以抽象,动态的创建对象。它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

使用

Java实现

建造者中先创建对象
public class ProductCreateBeforeParam {private String partA;private String partB;private String partC;public void setPartA(String partA) {this.partA = partA;}public void setPartB(String partB) {this.partB = partB;}public void setPartC(String partC) {this.partC = partC;}public void show() {//显示产品的特性System.out.println(toString());}@Overridepublic String toString() {return "Product{" +"partA='" + partA + '\'' +", partB='" + partB + '\'' +", partC='" + partC + '\'' +'}';}static abstract class Builder {//创建产品对象protected ProductCreateBeforeParam productCreateBeforeParam = new ProductCreateBeforeParam();public abstract Builder buildPartA();public abstract Builder buildPartB();public abstract Builder buildPartC();//返回产品对象public ProductCreateBeforeParam getResult() {return productCreateBeforeParam;}}static class Concrete2Builder extends Builder {@Overridepublic Builder buildPartA() {System.out.println("Concrete2建造 PartA");productCreateBeforeParam.setPartA("Concrete2建造的PartA");return this;}@Overridepublic Builder buildPartB() {System.out.println("Concrete2建造 PartB");productCreateBeforeParam.setPartB("Concrete2建造的PartB");return this;}@Overridepublic Builder buildPartC() {System.out.println("Concrete2建造 PartC");productCreateBeforeParam.setPartC("Concrete2建造的PartC");return this;}}static class ConcreteBuilder extends Builder {@Overridepublic Builder buildPartA() {System.out.println("Concrete建造 PartA");productCreateBeforeParam.setPartA("Concrete建造的PartA");return this;}@Overridepublic Builder buildPartB() {System.out.println("Concrete建造 PartB");productCreateBeforeParam.setPartB("Concrete建造的PartB");return this;}@Overridepublic Builder buildPartC() {System.out.println("Concrete建造 PartC");productCreateBeforeParam.setPartC("Concrete建造的PartC");return this;}}public static void main(String[] args) {ProductCreateBeforeParam.ConcreteBuilder builder = new ProductCreateBeforeParam.ConcreteBuilder();builder.buildPartA().buildPartB().buildPartC().getResult().show();}
}

*****注重创建过程中对于产品的操作

建造者后创建对象

/*** @author advancer*/
public class ProductCreateByParam {private final String partA;private String partB;private String partC;public ProductCreateByParam(Builder builder) {this.partA = builder.partA;this.partB = builder.partB;this.partC = builder.partC;}public void show() {//显示产品的特性System.out.println(this);}public static Builder builder() {return new Builder("default");}@Overridepublic String toString() {return "Product{" +"partA='" + partA + '\'' +", partB='" + partB + '\'' +", partC='" + partC + '\'' +'}';}static class Builder {private final String partA;private String partB;private String partC;public Builder(String partA) {this.partA = partA;}public Builder partB(String partB) {this.partB = partB;return this;}public Builder partC(String partC) {this.partC = partC;return this;}//构建产品对象public ProductCreateByParam build() {return new ProductCreateByParam(this);}}public static void main(String[] args) {ProductCreateByParam.builder().partB("创建参数PartB").partC("创建参数PartC").build().show();}
}

*****注重创建过程中对于产品的参数构建

介绍

UML

  1. Product是产品类。
  2. Director为指挥者,使用Builder开始建造;
  3. Builder是抽象建造者,规范产品的组建,一般由子类实现;
  4. ConcreteBuilder是具体建造者,实现抽象类定义的所有方法,并且返回一个组建好的对象;
  5. 对应上述代码建造者中先创建对象

作用:

  • 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
  • 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:
  1. 方便创建一个复杂对象的工作,其通常由各个部分的子对象用一定的算法构成,而无需知道算法实现过程。
  2. 由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
解决原理:
  • 创建者模式隐藏了复杂对象的创建过程
  • 将负责对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
  • 把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

优缺点

优点:
  • 建造者独立,易扩展。
  • 便于控制细节风险。
缺点:
  • 产品必须有共同点,范围有限制。
  • 2、如内部变化复杂,会有很多的建造类。

使用场景

场景适用分析:
  • 适用

    • 需要生成的对象具有复杂的内部结构。

    • 需要生成的对象内部属性本身相互依赖。

    • 多个部件装配到一个对象中,但产生的运行结果不相同。

    • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性。

  • 不适用

    • Builder模式不适合创建差异性很大的产品类。

    • 产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本。

何时使用

  • 一些基本结构不会变,而其组合经常变化的时候

    1. 一个类有很多属性,必须创建对象的时候初始化,如果利用构造函数初始化这些属性,那构造函数回很长,太多参数也不利于使用,容易出错,但是放到set方法中,又不能保证属性的必须初始化;
    2. 如果类的属性之间有一定的依赖关系或者约束条件,我们继续使用构造函数配合 set() 方法的设计思路,那这些依赖关系或约束条件的校验逻辑就无处安放了。
    3. 如果我们希望创建不可变对象,也就是说,对象在创建好之后,就不能再修改内部的属性值,要实现这个功能,我们就不能在类中暴露 set() 方法。构造函数配合 set() 方法来设置属性值的方式就不适用了。

实例

  • 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。

  • JAVA 中的 StringBuilder

    public StringBuilder append(String str) {...}//apend(String str)等方法便是建造的过程
    
  • Lombok中的注解@Builder自动生成的创建者模式。

    //Before:@Builderclass Example<T> {private T foo;private final String bar;}//After:class Example<T> {private T foo;private final String bar;private Example(T foo, String bar) {this.foo = foo;this.bar = bar;}public static <T> ExampleBuilder<T> builder() {return new ExampleBuilder<T>();}public static class ExampleBuilder<T> {private T foo;private String bar;private ExampleBuilder() {}public ExampleBuilder foo(T foo) {this.foo = foo;return this;}public ExampleBuilder bar(String bar) {this.bar = bar;return this;}@java.lang.Override public String toString() {return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";}public Example build() {return new Example(foo, bar);}}}
    

注意事项:

与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

与工厂模式的区别:

  • 建造者模式更加关注创建时的逻辑。
         @Override public String toString() {return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";}public Example build() {return new Example(foo, bar);}}}

注意事项:

与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

与工厂模式的区别:

  • 建造者模式更加关注创建时的逻辑。
  • 工厂模式更加关注创建的对象不同。

创建型模式——建造者模式(Builder Pattern)相关推荐

  1. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  2. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  3. 【创建型】建造者模式(Builder Pattern)

    主要作用: 可以使多个简单的对象,一步一步构建成一个复杂的对象 应用实例: 1.去肯德基,汉堡.可乐.薯条.炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐". 2.JA ...

  4. Java创建型设计模式——建造者模式

    文章目录 1.0概念理解 2.0编码理解 2.1编码说明 2.2编码实现 五种创建型设计模式:工厂方法模式.抽象工厂模式.建造者模式.原型模式.单例模式 1.0概念理解 ​ ​ 一句话理解:建造者模式 ...

  5. java设计模式——创建型之建造者模式

    自大学课程初识设计模式以来,就越发觉得有必要系统学习一下设计模式. 刚好在实习前准备期间课比较少,抽出一点时间整理一下记一些笔记,复制粘贴比较多. 笔记比较适合学习过设计模式的同学. Builder ...

  6. 每天学习一个设计模式(九):创建型之建造者模式

    目录 一.基本概念 二.通俗解释 三.建造者模式详解 1.造车的例子 2.建造者模式的结构 3.建造者模式的优点 4.使用场景 5.注意事项 四.建造者模式的扩展和最佳实践 建造者模式的扩展 最佳实践 ...

  7. 创建型设计模式——建造者模式

    1.提出问题 假如说,我们需要建房子:这一过程为打桩.砌墙.封顶.房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的.3)请编写程序,完成需求. 传统的想法应该就是下 ...

  8. 创建型设计模模式---建造者模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  9. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  10. 创建型设计模模式---原型模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

最新文章

  1. 获取app当前可用的剩余内存
  2. 微软私有云分享(R2)5-域升级造成Hyper-V主机无法实时迁移
  3. RocketMQ类关系图之NameServer
  4. 使用python实现大文件分割与合并
  5. 常州大学 计算机与人工智能学院,第一届计算机视觉青年学者论坛(CVYSF)在常州大学举办...
  6. JS 前20个常用操作字符串的函数
  7. 信息学奥赛一本通C++语言——1019: 浮点数向零舍入
  8. 程序员,过了 40 岁,连 107 岁的 IBM 都不要我们了!
  9. OpenCV-图像饱和度
  10. 打印工资条怎么做到每个人都有表头明细_快速制作工资条的方法
  11. 【Pix4d精品教程】未校准相机:287 out of 402 images calibrated (71%), all images enabled, 6 block,问题分析及解决方案汇总
  12. 免费的文字转语音朗读 -API接口
  13. 筹备酒吧之路——音响篇
  14. 2022年湖北省房地产经纪人(房地产经纪业务操作)练习题及答案
  15. codeforces 697C Lorenzo Von Matterhorn(二叉树LCA)
  16. 《人无信不立》你是一个有信用的人吗?
  17. 电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析
  18. HTML5期末大作业:个人空间相册网页设计 (6页) HTML+CSS+JavaScript
  19. [编程题] 困兽之斗
  20. CAD制图初学入门常见问题秘笈,助你摆脱节后综合症!(上)

热门文章

  1. TensorRT - 扩展TensorRT C++API的模型输入维度,增加Dims5,Dims6,Dims7,Dims8
  2. mediawiki内嵌php,Mediawiki的模板
  3. oracle创建用户并授权管理员,Oracle创建用户并授权【数据库】
  4. zcmu——4939: 大整数排序
  5. php如何获取百度快照,php代码获取 百度收录和百度快照时间
  6. 计算机机箱最新推出的是什么架构,独特三舱位结构:LIANLI 联力 推出 PC-O12 E-ATX 全塔机箱...
  7. 博客搭建六:绑定自己域名的方法
  8. 百度网页快照删除服务恢复运营
  9. 华南理工计算机就业棒棒,为梦想、为公益,华南理工大学学子为爱发声
  10. HBuilder开发App