文章目录

  • 3.4 建造者模式
    • 3.4.1 角色:
    • 3.4.2 使用场景
    • 3.3.3 代码实现
    • 3.4.4 与工厂模式对比

3.4 建造者模式

定义:建造者模式(Builder Pattern)又叫生成器模式,实际开发中,我们所需要的对象构建时非常复杂,且有很多步骤需要处理时,这时建造者模式就很适合。比如MyBatis中的SqlSessionFactory对象的创建,我们不光要创建SqlSessionFactory本身的对象,还有完成MyBatis的全局配置文件和映射文件的加载解析操作,之后把解析出来的信息绑定在SqlSessionFactory对象中

参考MyBatis的代码


优点:

  • 封装性好,创建和使用分离;
  • 扩展性好,建造类之间独立、一定程度上解耦。
    问题:
  • 产生多余的Builder对象;
  • 产品内部发生变化,建造者都要修改,成本较大。

3.4.1 角色:

  • builder(抽象建造者):为创建一个产品对象的各个部件指定抽象接口。
  • ConcreteBuilder(具体的建造者):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
  • Director(指挥者):构造一个使用Builder接口的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
  • Product(产品类):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

3.4.2 使用场景

  • 产品类非常的复杂,或者产品类中的调用顺序不同产生了不同的效能
  • 多个部件或者零件,都可以装配到一个对象中,但是产生的结果又不相同
  • 当时初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时
  • 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到(需要多行代码)。

3.3.3 代码实现

/*** @Description 学习抽象类  (产品类)* @Auther 九止* Date 2022/10/3 16:46*/
public abstract class Study {/*** 学习顺序参数*/private ArrayList<String> sequence = new ArrayList<>();/*** 看书学习*/public abstract void studyByBook();/*** 看视频学习*/public abstract void studyByVideo();/*** 刷题*/public abstract void brushQuestion();/*** 复习*/public abstract void review();/*** 执行学习计划*/final public void execute() {this.sequence.forEach(item->{switch(item){case "studyByBook":this.studyByBook();break;case "studyByVideo":this.studyByVideo();break;case "brushQuestion":this.brushQuestion();break;case "review":this.review();break;default:throw new RuntimeException("提示:学习计划有误!");}});}public ArrayList<String> getSequence() {return sequence;}public void setSequence(ArrayList<String> sequence) {this.sequence = sequence;}
}//=============================================================================/*** @Description 英语学习类  (产品类)* @Auther 九止* Date 2022/10/3 17:01*/
public class EnglishStudy extends Study{@Overridepublic void studyByBook() {System.out.println("开始通过看书学习英语……");}@Overridepublic void studyByVideo() {System.out.println("开始通过看视频学习英语……");}@Overridepublic void brushQuestion() {System.out.println("开始通过刷题学习英语……");}@Overridepublic void review() {System.out.println("开始通过复习学习英语……");}
}//=============================================================================/*** @Description 数学学习类  (产品类)* @Auther 九止* Date 2022/10/3 17:01*/
public class MathStudy extends Study{@Overridepublic void studyByBook() {System.out.println("开始通过看书学习数学……");}@Overridepublic void studyByVideo() {System.out.println("开始通过看视频学习数学……");}@Overridepublic void brushQuestion() {System.out.println("开始通过刷题学习数学……");}@Overridepublic void review() {System.out.println("开始通过复习学习数学……");}
}
/*** @Description 学习计划抽象建造者  (抽象建造者) 在该类中提供设置产品类各个属性的方法* @Auther 九止* Date 2022/10/3 16:29*/
public interface StudyPlanBuilder{/*** 设置学习顺序* @param sequence*/void setSequence(ArrayList<String> sequence);/*** 获取学习对象* @return*/Study getStudy();
}//=============================================================================/*** @Description 英语学习计划建造者* @Auther 九止* Date 2022/10/3 17:04*/
public class EnglishStudyPlanBuilder implements StudyPlanBuilder{private EnglishStudy englishStudy = new EnglishStudy();@Overridepublic void setSequence(ArrayList<String> sequence) {englishStudy.setSequence(sequence);}@Overridepublic Study getStudy() {return this.englishStudy;}
}//=============================================================================/*** @Description 数学学习计划建造者* @Auther 九止* Date 2022/10/3 17:04*/
public class MathStudyPlanBuilder implements StudyPlanBuilder{private MathStudy mathStudy = new MathStudy();@Overridepublic void setSequence(ArrayList<String> sequence) {mathStudy.setSequence(sequence);}@Overridepublic Study getStudy() {return this.mathStudy;}
}

/*** @Description 学生类充当指挥者的角色 (指挥者)* @Auther 九止* Date 2022/10/3 17:13*/
public class Student {private final ArrayList<String> sequence = new ArrayList<>();private final EnglishStudyPlanBuilder englishStudyPlanBuilder = new EnglishStudyPlanBuilder();private final MathStudyPlanBuilder mathStudyPlanBuilder = new MathStudyPlanBuilder();private static final String STUDY_BY_BOOK = "studyByBook";private static final String REVIEW = "review";private static final String STUDY_BY_VIDEO = "studyByVideo";private static final String BRUSH_QUESTION = "brushQuestion";/*** 英语学习计划A*/public EnglishStudy englishPlanA() {this.sequence.clear();this.sequence.add(STUDY_BY_BOOK);this.sequence.add(REVIEW);this.sequence.add(STUDY_BY_VIDEO);this.sequence.add(BRUSH_QUESTION);this.englishStudyPlanBuilder.setSequence(this.sequence);return (EnglishStudy) this.englishStudyPlanBuilder.getStudy();}/*** 英语学习计划B*/public EnglishStudy englishPlanB() {this.sequence.clear();this.sequence.add(STUDY_BY_BOOK);this.sequence.add(STUDY_BY_VIDEO);this.sequence.add(BRUSH_QUESTION);this.sequence.add(REVIEW);this.englishStudyPlanBuilder.setSequence(this.sequence);return (EnglishStudy) this.englishStudyPlanBuilder.getStudy();}/*** 数学学习计划A*/public MathStudy mathPlanA() {this.sequence.clear();this.sequence.add(STUDY_BY_BOOK);this.sequence.add(REVIEW);this.sequence.add(STUDY_BY_VIDEO);this.sequence.add(BRUSH_QUESTION);this.mathStudyPlanBuilder.setSequence(this.sequence);return (MathStudy) this.mathStudyPlanBuilder.getStudy();}/*** 数学学习计划B*/public MathStudy mathPlanB() {this.sequence.clear();this.sequence.add(STUDY_BY_BOOK);this.sequence.add(STUDY_BY_VIDEO);this.sequence.add(BRUSH_QUESTION);this.sequence.add(REVIEW);this.mathStudyPlanBuilder.setSequence(this.sequence);return (MathStudy) this.mathStudyPlanBuilder.getStudy();}}
public class Test {public static void main(String[] args) {Student student = new Student();student.mathPlanA().execute();System.out.println("-------------------------");student.englishPlanB().execute();}
}

3.4.4 与工厂模式对比

  • 建造者模式更加注重方法的调用顺序,工厂模式注重于创建对象。
  • 杂的部件组成,工厂模式创建出来的都一样。
  • 关注点不一样,工厂模式只需要把对象创建出来就行了,而建造者模式不仅要创建出这个对象,还要知道这个对象由哪些部分组成。
  • 建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样。

引用了马士兵邓澎波老师笔记的部分原文

设计模式篇(3)——建造者模式深度阐述相关推荐

  1. 从零开始学习Java设计模式 | 创建型模式篇:建造者模式

    在本讲,我们来学习一下创建型模式里面的最后一个设计模式,即建造者模式. 概述 建造者模式是指将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示. 读完这句话之后,我估计很多人都已经懵 ...

  2. 大聪明教你学Java设计模式 | 第二篇:建造者模式

    前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...

  3. 设计模式之路 | 建造者模式

    模式的定义与特点 建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式.它是将一个复杂的对象分解为多个简单的对象 ...

  4. 设计模式系列之建造者模式构建实体类

    设计模式系列之建造者模式(Build Pattern)构建实体类 模式定义 建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法. 所谓建造者模式就是**将组件和组件的组件过 ...

  5. Java 设计模式情景分析——建造者模式

    当我们遇到类似汽车的装配,需要车轮.方向盘.发动机,还有各种小零件时,为了在构建过程中隐藏实现细节,就可以使用建造者模式 (Builder模式) 将部件和组装过程分离,使得构建过程和部件都可以自由扩展 ...

  6. Java设计模式10,建造者模式

    目录 一.建造者模式 二.建造者模式的结构 1.抽象建造者(Builder) 2.具体建造者(ConcreteBuilder) 3.指挥者(Director) 4.产品(Product) 三.建造者模 ...

  7. 设计模式---5(建造者模式的概念及其实现,建造者模式的角色与职责,建造者模式和工厂模式的区别)

    建造者模式 建造者模式的概念 Builder 模式也叫建造者模式或者生成器模式,是由 GoF 提出的 23 种设计模式中的一种. Builder 模式是一种对象创建型模式之一,用来隐藏复合对象的创建过 ...

  8. 设计模式二:建造者模式

    建造者模式 想要创建一个由多个部分构成的对象,而且他的构成需要一步接一步地完成.只有当各个部分都创建好,这个对象才是完整的.这时就需要建造者模式 建造者设计模式:将一个复杂对象的构造过程与其表现分离, ...

  9. 【设计模式自习室】建造者模式

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该设计模式的详细介绍,包括: 引子,意图(大白话解释) 类图,时序图(理论规范) 该模式的代码示例: ...

最新文章

  1. 小样本点云深度学习库_2019-01-07-小样本深度学习
  2. [转]JavaScript ES6 class指南
  3. 在BAE上搭建python,django环境小记
  4. 微信重磅更新!这个功能等了 7 年
  5. JS-分支结构(单向-双向-多向-嵌套)
  6. 关于银行等带有安全控件插件的输入selenium无法sendkeys的解决方案
  7. spring框架mvc框架_5篇Spring框架书籍,通过MVC学习Spring
  8. linux机顶盒 安卓机顶盒 优劣势分析,网络机顶盒怎么样 网络机顶盒优缺点介绍【详解】...
  9. 水浊度传感器( ADC 代码详解)
  10. 《人生七年》纪录片总结
  11. 移动硬盘(USB3.0)1TB 在自己电脑上突然识别不了
  12. Linux高级运维: Session与Cookie 、 部署memcached和Session共享(OPERATION----DAY36)
  13. php 变量 问号,php – Laravel查询返回问号而不是变量值
  14. TFS文件编码检查机制和修改(Team Foundation Server 2013)
  15. Elasticsearch: Query string与Simple query string
  16. 系分 - 计算机网络
  17. [算法课] 小偷问题
  18. 微信浏览器中,aler弹框不显示域名
  19. MPLAB X IDE安装黑色主题
  20. db dbm dbi dbc 的含义

热门文章

  1. 巨大的效果差距!显示器与电视对比评测
  2. acw周赛44 —— 合适数对
  3. 一周随笔(1201)
  4. 遇到问题: 文字输入后面的字就删除了
  5. 880_AUTOSAR_TPS_GenericStructureTemplate27_变体点1
  6. Arduino红外发射实验
  7. Android 模拟器 Genymotion 安装常见问题记录
  8. 4.4 求解同余方程
  9. pdf转换成excel转换器破解版下载
  10. 景区票务系统的主要功能有哪些