2023年7月22日

建造者模式

一 场景

        在软件开发中,我们有时候会创建一些复杂的对象,这些对象有着复杂的内部结构,它们都是有一系列部件组成。这些部件相互依赖,而且部件的构建通常面临着复杂的变化。我们需要先按照一定的顺序来创建各个部件,最后将这些部件组装成一个完整的对象。

        针对上述情况,我们可以使用建造者模式来创建对象。建造者模式可以让创建对象的算法独立于对象的组成部分以及装配方式。

二 定义

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

三 类图

 

Builder(抽象建造者):Builder抽象建造者既可以是抽象类,也可以是接口。抽象建造者中一般是定义了两类方法。一类是声明了创建复杂对象各个部件的方法。另一类声明了专门用于返回复杂对象的方法。

 

ConcreteBuilder(具体建造者):具体建造者类是抽象建造者的具体实现类。它主要了实现了复杂产品各个部件的具体构造和装配方法。具体建造者还会定义和明确它所创建的复杂对象,并将创建好的产品返回。

 

 

Director(指挥者类):指挥者类一般是用于定义复杂对象部件的建造次序。指挥者类会引用一个抽象建造者。指挥者类在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。

 

在有些情况下,为了简化代码。我们可以省略指挥者类。将指挥者类Director和抽象建造者类Builder合并,在Builder中提供逐步构建复杂产品对象的方法。

 

Product(产品类):产品类就是我们要构建的复杂对象,它一般包含了多个组成部件。

 

四 代码示例

       我们可能会自己组装电脑主机。电脑主机是有cpu,内存,主板,硬盘,机箱等组成。我们自己组装电脑主机的话,可以在电脑城或者网上依次购买cpu,内存,主板,硬盘,机箱这些部件。只要确保这些部件的型号是兼容的,再把它们组装到一起就变成了电脑主机。

       一般电脑主机使用场景的不同,我们对其配置的要求也是不同的。如果平时在家里就上上网的电脑,配置就可以低一些。而在工作中使用的电脑,配置就要高一些。

       针对组装电脑主机的这种情景,我就可以使用建造者模式来进行设计。

       我们定义一个Computer类来表示电脑主机的产品类,在Computer类中定义了cpu,内存,主板,硬盘,机箱这些属性。

 

 

        我们定义了一个抽象建造者类AbstractComputerBuilder。在AbstractComputerBuilder类中,定义了一个Computer类型的产品对象。然后再声明了建造组成电脑主机各个部件的虚方法。最后再定义了getComputer方法来返回组装完毕的电脑主机。

 

       我们定义了一个HomeComputerBuilder具体建造者类,来组装配置低的家庭电脑。在HomeComputerBuilder类中,都覆写了父类AbstractComputerBuilder中定义的建造各个部件的虚方法。例如:家庭电脑配置要求低一些,所以cpu是4核,内层只有8G等。

 

       同理我们又定义了一个WorkComputerBuilder具体建造者类,来组装配置要求高的工作电脑。例如:工作电脑配置要求高,所以cpu是12核的,内层需要32G。

 

 

        最后定义了指挥者ComputerDirector类。在ComputerDirector类定义了一个抽象建造者类AbstractComputerBuilder。指挥者使用该抽象类来引用一个具体建造者类。

        在constructComputer方法中,程序会按照一定的顺序,依次调用建造者类中构建电脑主机各个部件的方法,最后将组装好的主机返回。

 

运行示例

 

 

运行结果

 

 

五 总结

建造者模式是一种创建型模式。它主要用于一些复杂对象的创建。建造者模式使得对象的建造与表示分离。客户端不需要知道产品的具体构建细节,就可以使用相同的创建过程得到不同的产品。

优点:

  1. 建造者模式复杂产品的创建步骤分解在不同的部件方法中,可以更加精细地控制产品的创建,使得创建过程非常清晰。
  2. 建造者模式将产品的建造和表示分离,实现了解耦,可以使用相同的创建过程得到不同的产品。
  3. 增加新的具体建造者无需修改原有代码,系统易于扩展,符合“开闭原则“。

缺点:

  1. 如果产品的内部变化复杂,建造者模式就需要定义很多具体建造者类来实现这种变化。这样可能导致系统变得庞大,增加系统的维护成本。

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

       建造者模式和工厂模式有许多相似的地方。它们都属于对象创建型模式,都是用来创建对象的。那它们的区别主要在哪里呢?

       建造者模式和工厂模式主要区别是创建对象的粒度和复杂度不同。

       工厂模式只关心产品的整体,而建造者模式注重的是产品中各个部件构建的过程,以及这些部件的装配顺序。建造者模式是通过一步一步地部件的生产,精确构造创建出一个复杂的对象。就像工厂里生产机器,先生产出一个个零件,再把这些零件按顺序组装成一个机器。

       以本文中组装电脑主机为例,工厂模式的话,就是生产工作电脑和家庭电脑两种产品。而建造者模式的话,则关注电脑主机中,cpu,主板,内存,硬盘等这些部件的生产,通过生产出这些不同的部件,最后按一定顺序来组装成工作电脑和家庭电脑这两种不同的产品。

 

posted @ 2023-07-22 15:40 yaoxtao 阅读(37) 评论(0) 推荐(0) 编辑

2023年2月6日

摘要: SpringBoot怎么自定义一个Starter starter是什么 spring-boot-starter是spring-boot的一个非常重要组成部分。spring-boot-starter可以理解为一个可拔插式的组件。它可以让模块开发独立化,相互间依赖更加松散,也可以更加方便地集成。 当应用 阅读全文
posted @ 2023-02-06 23:24 yaoxtao 阅读(292) 评论(0) 推荐(0) 编辑

2023年1月29日

摘要: 装饰模式 一 场景 在软件开发中,我们有时候需要对一个已经存在对象的某个功能进行扩展。如果我们在这个对象的功能基础上进行修改,比如加入了新的字段,新的方法。这样就会增加原有对象的复杂度,不符合开闭原则。 有没有什么方法能既可以不改变原对象,又可以对对象的功能进行扩展了?装饰模式恰好针对这种情况提供了 阅读全文
posted @ 2023-01-29 22:50 yaoxtao 阅读(51) 评论(0) 推荐(0) 编辑

2022年9月12日

摘要: Spring MVC组件之ViewResolver ViewResolver概述 ViewResolver组件的作用主要根据视图名和本地化的Locale,来解析出相应的视图View对象。 在SpringMvc的源码中,ViewResolver是一个接口。该接口主要定义了一个方法。 View reso 阅读全文
posted @ 2022-09-12 18:49 yaoxtao 阅读(214) 评论(0) 推荐(0) 编辑

2022年8月29日

摘要: Spring MVC组件之HandlerAdapter HandlerAdapter概述 HandlerAdapter组件是一个处理器Handler的适配器。HandlerAdapter组件的主要作用是适配特定的Handler来处理相应的请求。 在SpringMvc的源码中, HandlerAdap 阅读全文
posted @ 2022-08-29 23:19 yaoxtao 阅读(628) 评论(0) 推荐(1) 编辑

2022年8月13日

摘要: Spring MVC组件之HandlerMapping HandlerMapping概述 HandlerMapping组件的作用解析一个个Request请求,并找到相应处理这个Request的Handler。Handler一般可以理解为Controller控制器里的一个方法。 HandlerMapp 阅读全文
posted @ 2022-08-13 18:54 yaoxtao 阅读(511) 评论(0) 推荐(0) 编辑

2022年4月21日

摘要: 代理模式 一 场景 在软件开发中,有时候需要访问远程jvm中的对象。我们可以在本地jvm中创建一个代理对象。用这个代理对象将网络细节封装起来,使得客户端不必考虑网络的存在。客户端访问远程jvm对象就像调用本地对象一样。这就是代理模式的远程代理。 有时候程序创建的一些对象,十分消耗系统资源,这些对象的 阅读全文
posted @ 2022-04-21 11:09 yaoxtao 阅读(310) 评论(0) 推荐(0) 编辑

2022年3月20日

摘要: 策略模式 一 意图 在平时的软件开中,我们对一个功能可能有多种不同的实现方式。程序需要在这些不同的实现方式之间进行切换。而实现方式的切换,程序中往往需要大量判断逻辑的代码。当每增加一种新的实现方式后,程序的复杂度也会随之增加。 对于这种情况,策略模式就是一种好的解决方案。使用策略模式,可以把这些实现 阅读全文
posted @ 2022-03-20 21:00 yaoxtao 阅读(454) 评论(0) 推荐(0) 编辑

2016年9月11日

摘要: 状态模式 一 意图 一些对象具有多种状态,而且在不同的状态下也具有不同的行为, 这些状态在某些情况下又能够相互转换。 为了在编码时,对上述的对象能够好的进行设计和管理,我们可以使用一种被称之为状态模式的设计模式。 状态模式主要是解决当控制一个对象状态转换的条件表达式,过于复杂的情况。把状态的判断逻辑 阅读全文
posted @ 2016-09-11 23:11 yaoxtao 阅读(303) 评论(0) 推荐(0) 编辑

2015年11月2日

摘要: 单例模式一. 意图 对于某些类来说,我们其实只需要有一个实例化的对象。比如:注册表,资源管理器,打印机驱动程序等等。如果我们保证以上的类只有一个实例,并只提供一个统一的访问点的话。系统中便可以统一管理这个对象。以上类只有一个实例,同时也可以节约系统资源,保证对象信息的一致性。 我们可以通过单例模式来... 阅读全文
posted @ 2015-11-02 23:14 yaoxtao 阅读(670) 评论(0) 推荐(0) 编辑

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示