【设计模式】创建型-②Builder模式
【设计模式】创建型-②Builder模式
注
学习核心
构造器模式核心
- 基本概念:将一个复杂对象的创建过程进行封装,提供构造入口,可以按照步骤一步步构建对象
- 场景应用
- 盖房子:不同物料组装,生成不同的装修方案
- 电脑组装:电脑元件组装
业务场景案例
- 【游戏场景】:游戏要素的按需加载
- 【Lombok中的builder注解】:根据注解提供的Builder类构建类对象
- 【MyBatis框架】:SqlSessionFactory的组装(根据xml配置调用SqlSessionFactoryBuilder方法进行组装)
基本概念
建造者模式:将一个复杂对象的构建过程进行封装,可以按照步骤一步步构造对象(像是盖房子、组装电脑一样)
将⼀个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。通过将多个简单对象一步步组装构建出一个复杂对象的过程。适用于一些基本物料不变,但其组合经常变化的场景
场景举例
- 游戏场景:建造者模式初始化游戏元素(根据用户的网络资源等情况构建不同清晰度的游戏场景和不同模式下的游戏元素)
- Lombok中的builder:Lombok中的builder注解本质是生成了一个构造器Builder类,通过这个类可以构造出带此注解的对象
Builder设计模式满⾜了单⼀职责原则以及可复⽤的技术、建造者独⽴、易扩展、便于控制细节⻛险。但同时当出现特别多的物料以及很多的组合后,类的不断扩展也会造成难以维护的问题。但这种设计结构模型可以把重复的内容抽象到数据库中,按照需要配置。这样就可以减少代码中⼤量的重复。
场景案例
【1】套餐装修服务场景
场景介绍:模拟装修公司提供套餐装修服务的场景(不同物料商品的组合),根据不同商品的组合最终出一个报价
实现说明:物料构建、装修套餐组合、Builder
1>定义父接口构建物料的基本信息(场景类型、品牌、价格、型号、描述等),定义子类实现该接口
定义Matter父接口,对外提供物料的基本信息获取的接口定义
定义子类接口实现Matter父接口(根据自定义type字段划分不同种类的物料,其余字段则限定同一种类不同品种的物料)
2>传统实现方式:根据指定场景用if-else组合不同的物料以生成相应的套餐组合,构建List接收相应的物料生成组合套餐详情
通过指定的套餐限定不同物料组合(if...else...实现),物料组装、信息填充、价格合计
3>Builder模式:
定义IMenu装修包接口(物料组装系列方法:appendXXX(包括物料信息组装和价格累计)、信息填充:getDetail)
定义DecorationPackageMenu装修包实现IMenu
定义方法构建装修包详情:new DecorationPackageMenu(xxx).appendXXX系列方法
考虑业务扩展性,亦可将组合套餐以配置的形式存储到数据库中,页面便可自动加载
【2】MyBatis框架应用
核心:MyBatis 环境初始化会解析项目配置,然后一步步构建SqlSessionFactory
对象(过程中调用了SqlSessionFactoryBuilder
包含诸多buildXXX
系列方法进而构建工厂对象)
在Mybatis环境的初始化过程中,SqlSessionFactoryBuilder
会调用XMLConfigBuilder
读取所有的MybatisMapConfig.xml
和所有的*Mapper.xml
文件,构建Mybatis运行的核心对象Configuration
对象,然后将该Configuration对象作为参数构建一个SqlSessionFactory
对象
其中XMLConfigBuilder
在构建Configuration
对象时,也会调用XMLMapperBuilder
用于读取*Mapper
文件,而XMLMapperBuilder
会使用XMLStatementBuilder
来读取和build所有的SQL语句
在这个过程中,有一个相似的特点,就是这些Builder会读取文件或者配置,然后做大量的XpathParser
解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤,因此大量采用了Builder模式来解决。对于builder的具体类,方法都大都用build*开头,例如SqlSessionFactoryBuilder
包含诸多buildXXX
系列方法:即根据不同的输入参数来构建SqlSessionFactory这个工厂对象