设计模式


文章目录

  • 设计模式
  • 前言
  • 一、构建者模式
    • 1. 定义
    • 2. 主要作用
    • 3. 解决的问题
  • 二、模式原理
    • 1.模式讲解
    • 2. 实例讲解
      • 2.1 实例概况
      • 2.2 使用步骤
  • 三、优缺点
    • 1. 优点
    • 2. 缺点
  • 四、应用场景
  • 五、在MyBatis中的应用
  • 参考文档

前言


一、构建者模式

1. 定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

2. 主要作用

在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。

  • 用户只需要给出指定复杂对象的类型和内容;
  • 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)

3. 解决的问题

  • 方便用户创建复杂的对象(不需要知道实现过程)
  • 代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)
例子:造汽车 & 买汽车。工厂(建造者模式):负责制造汽车(组装过程和细节在工厂内)
汽车购买者(用户):你只需要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了
(不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等))

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、模式原理

1.模式讲解

  1. 指挥者(Director)直接和客户(Client)进行需求沟通;
  2. 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
  3. 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
  4. 各个具体建造者负责进行产品部件的构建;
  5. 最终构建成具体产品(Product)。

2. 实例讲解

2.1 实例概况

背景:小成希望去电脑城买一台组装的台式主机
过程:
1. 电脑城老板(Diretor)和小成(Client)进行需求沟通(买来打游戏?学习?看片?)
2. 了解需求后,电脑城老板将小成需要的主机划分为各个部件(Builder)的建造请求(CPU、主板blabla)
指挥装机人员(ConcreteBuilder)去构建组件;
将组件组装起来成小成需要的电脑(Product)

2.2 使用步骤

步骤1: 定义组装的过程(Builder):组装电脑的过程


public  abstract class Builder {  //第一步:装CPU
//声明为抽象方法,具体由子类实现 public abstract void  BuildCPU();//第二步:装主板
//声明为抽象方法,具体由子类实现 public abstract void BuildMainboard();//第三步:装硬盘
//声明为抽象方法,具体由子类实现 public abstract void BuildHD();//返回产品的方法:获得组装好的电脑public abstract Computer GetComputer();
}

步骤2: 电脑城老板委派任务给装机人员(Director)

public class Director{//指挥装机人员组装电脑public void Construct(Builder builder){builder. BuildCPU();builder.BuildMainboard();builder. BuildHD();}}

步骤3:创建具体的建造者(ConcreteBuilder):装机人员

//装机人员1public class ConcreteBuilder extend  Builder{//创建产品实例Computer computer = new Computer();//组装产品@Overridepublic void  BuildCPU(){  computer.Add("组装CPU")}  @Overridepublic void  BuildMainboard(){  computer.Add("组装主板")}  @Overridepublic void  BuildHD(){  computer.Add("组装主板")}  //返回组装成功的电脑@Overridepublic  Computer GetComputer(){  return computer}
}

步骤4:定义具体产品类(Product):电脑

public class Computer{//电脑组件的集合private List<String> parts = new ArrayList<String>();//用于将组件组装到电脑里public void Add(String part){parts.add(part);
}public void Show(){for (int i = 0;i<parts.size();i++){    System.out.println(“组件”+parts.get(i)+“装好了”);}System.out.println(“电脑组装完成,请验收”);}}

步骤5:客户端调用-小成到电脑城找老板买电脑


public class Builder Pattern{public static void main(String[] args){//逛了很久终于发现一家合适的电脑店
//找到该店的老板和装机人员Director director = new Director();Builder builder = new ConcreteBuilder();//沟通需求后,老板叫装机人员去装电脑
director.Construct(builder);//装完后,组装人员搬来组装好的电脑
Computer computer = builder.GetComputer();
//组装人员展示电脑给小成看
computer.Show();}}
组件CUP装好了
组件主板装好了
组件硬盘装好了
电脑组装完成,请验收

三、优缺点

1. 优点

  • 易于解耦
    将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
  • 易于精确控制对象的创建
    将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
  • 易于拓展
    增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。

2. 缺点

-建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。

  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

四、应用场景

  • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

五、在MyBatis中的应用

MyBatis中最经典的建造者模式肯定是获取SqlSessionFactory的过程。
下面是获取SqlSessionFactory的典型用法。

CopyClassPathResource resource = new ClassPathResource("mybatis-config.xml");
InputStream inputStream = resource.getInputStream();
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

通过上面代码发现,创建SqlSessionFactory的代码在SqlSessionFactoryBuilder中,进去一探究竟:

//整个过程就是将配置文件解析成Configration对象,然后创建SqlSessionFactory的过程
//Configuration是SqlSessionFactory的一个内部属性
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);return build(parser.parse());} catch (Exception e) {throw ExceptionFactory.wrapException("Error building SqlSession.", e);} finally {ErrorContext.instance().reset();try {inputStream.close();} catch (IOException e) {// Intentionally ignore. Prefer previous error.}}}public SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);}

代码比较简单,就不具体分析了。这里还是对号入座,列举下各个角色。

  • SqlSessionFactoryBuilder:指挥者角色
  • BaseBuilder:抽象Builder
  • XMLConfigBuilder:具体的Builder
  • SqlSessionFactory:需要被创建的产品

参考文档

程序员自由之路
建造者模式(Builder Pattern)- 最易懂的设计模式解析

设计模式:构建者模式相关推荐

  1. 设计模式-构建者模式

    设计模式-构建者模式 1 介绍 建造者模式:将多个简单的对象按产品创建顺序构建成一个复杂的对象.它提供了一种创建复杂对象的最佳方式. 优点: 1.建造者独立,易扩展. 2.便于控制细节风险. 缺点: ...

  2. [设计模式] 构建者模式

    问题:多个属性的对象创建 解决方案1:重载多个构造器,但是随着属性的增加,构造器个数也会成吨的增长,且要选择正确的构造器难度增添了不少. public class Computer {private ...

  3. C++编程思想 第2卷 第10章 设计模式 构建器模式:创建复杂对象

    构建器 Builder 模式的模板是将对象的创建与它的 表示法 分开 意味着 创建保持原状  但是产生对象 的表示法 不同 作为模型的自行车按照其内心来选择零部件组装一辆自行车 一个构建器与每个自行车 ...

  4. java设计模式---构建者模式

    创建者模式和工厂模式有点类似,不过关注点不同.工厂模式往往只关心你要的是什么,二不关心这个东西的具体细节是什么.而创建模式则关心的是这个东西的具体细节的创建.拿创建人物来说,我们关心的不仅是创建一个人 ...

  5. sql中如何统计各种零件的总数量_如何应用GOF设计模式中的构建者模式创建复合对象实例...

    软件项目实训及课程设计指导--如何应用GOF设计模式中的构建者模式创建复合对象实例 1.GOF设计模式中的构建者模式 构建者设计模式能够将一个复杂对象(它一般为组合类)的构建过程与它的表示部件相互分离 ...

  6. 构建器设计模式_创新设计模式:构建器模式

    构建器设计模式 以前我们看过工厂和抽象工厂模式. 这些模式可以达到目的,并且确实有用,但是在某些用例中,我们必须创建一个非常复杂的对象,并且创建它需要不同的步骤,每个步骤都需要不同的操作. 在这种情况 ...

  7. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  8. 设计模式心得1(工厂模式+单例模式+构建器模式+原型模式+适配器模式)

    设计模式分类 大致按照模式的应用目标分类,设计模式可以分为创建型模式.结构型模式和行为型模式. 创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory.Abstrac ...

  9. (二)设计模式——构建器,原型模式

    构建器(builder) 描述: 将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化). builder 模式主要用于"分步骤构建一个复杂的对象" ...

最新文章

  1. 2021年就业力排名TOP10的英国大学
  2. “光纤之父”高锟离世,感谢他的贡献
  3. Java中List.remove报UnsupportedOperationException异常
  4. 3G应用上新闻联播 TD-SCDMA被内定?
  5. chrome和safari_私人浏览器-如何在Chrome和Safari中使用隐身模式
  6. 软考信息系统项目管理师_项目进度管理2---软考高级之信息系统项目管理师014
  7. java方法语法_Java基础语法----方法
  8. PhotoShop cc 2017安装 zeplin插件
  9. linux触摸屏信息,[linux]如何将触摸屏信号识别为鼠标信号?
  10. DatePickerDialog的确定和取消按钮
  11. Substrate源码分析:启动流程
  12. 中石油 : 炸弹安放
  13. 菜单转换Java_java递归菜单树转换成pojo对象
  14. Win10中SAS软件安装失败的一些解决方法
  15. xxe漏洞浅谈以及复现
  16. P1650 田忌赛马
  17. HCIA网络基础11-IP路由原理及静态路由
  18. C语言模拟实现strlen
  19. qq农场android版,qq农场手机版
  20. 【九度】题目1375:陈博的完美主义(25分)

热门文章

  1. android8.1APP更新时出现安装包解析异常的提示
  2. JavaScript实现一个手机验证码输入框
  3. 【论文笔记】ObjectBox: From Centers to Boxes for Anchor-Free Object Detection
  4. 基于“时空逻辑”的新时空论
  5. 宇视VX系列服务器,VS-HD4000V-02 4TB VX1848 宇视 存储 一体化SATA企业级硬盘
  6. 微信订阅号消息列表重大更新!6点解读(必看)
  7. RX8025AC INTA周期电平输出的疑问
  8. Turn off digital signature [Windows 64bit OS test driver数字签名出错的解法]
  9. 抖音运营新手,常踩的十个坑(你中招了吗?)
  10. JVAV组件--系统框架--JIDE Action Framework