首页 > 其他分享 >建造者模式

建造者模式

时间:2023-07-22 15:57:24浏览次数:35  
标签:对象 建造 部件 电脑主机 模式 创建

建造者模式

一 场景

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

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

二 定义

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

三 类图

 

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,主板,内存,硬盘等这些部件的生产,通过生产出这些不同的部件,最后按一定顺序来组装成工作电脑和家庭电脑这两种不同的产品。

 

标签:对象,建造,部件,电脑主机,模式,创建
From: https://www.cnblogs.com/YaoxTao/p/17573479.html

相关文章

  • Unity编辑模式 一键获取Tilemap的格子信息
    动机由于地图是使用unitytilemap编辑的,服务端也希望获取一份相关的信息。相较于自己写个编辑器,直接利用unity的能力会更加敏捷。效果展示只需要将组件拖拽到含有Tilemap组件的GameObj上面,就可以点击按钮,获取格子信息。源码展示[CustomEditor(typeof(TilemapTool))][CanEdi......
  • ofstream 追加模式
    #includeusingnamespacestd;intmain(){ofstreamoutfile("example.txt",ios::app);if(outfile.is_open()){outfile<<"Thisisanewline.\n";outfile.close();}elsecout<<"Una......
  • 修改MySQL读写模式
    修改MySQL读写模式MySQL是一个开源的关系型数据库管理系统,广泛应用于互联网应用和企业级应用中。在MySQL中,存在着读写模式的设置,可以根据实际需求来调整数据库的读写性能和一致性。本文将介绍如何修改MySQL的读写模式,并提供代码示例。1.了解MySQL读写模式在MySQL中,有两种常见的......
  • OO 设计模式
    面向对象(ObjectOriented-OO)设计模式(DesignPattern)概念、设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结3个大类,23个设计模式、创建型模式:对象实例化的模式单例模式:确保某一个类只有一个实例,并且提供一个全局访问点简单工厂模式:让子类......
  • Spring框架的设计理念与设计模式(4)-Context组件
    关键词:Context,组件,Spring,BeanFactory,容器,Ioc上一章:[b]Spring框架的设计理念与设计模式(3)-Bean组件[/b][url]http://javapub.iteye.com/blog/751550[/url]下一章:[b]Spring框架的设计理念与设计模式(5)-Core组件[/b][url]http://javapub.iteye.com/......
  • MES/MOM国内市场现状趋势与新生态模式参考
    本文分享自华为云社区《工业互联网系列(七)MES/MOM国内市场现状趋势与新生态模式参考》,作者:云起MAE。国内工业互联网平台服务整体围绕数字化及数据价值挖掘的底层逻辑没有变,变的是服务边界的拓展、服务工具的简化。面对国内MES/MOM类生产管理软件供需两端都很痛苦的现状,华为云数字......
  • 接口默认方法,接口应用和适配器设计模式
    静态方法只能通过接口名调用!!! 私有方法主要用于提取两个不同方法的相同部分,两个不同方法分别调用私有方法,从而简化代码 ......
  • vue contenteditable编辑模式下,样式不生效
    换行后生成div,设置的样式没有生效 ***原因style标签上设置了scoped解决办法1、去掉style的scoped属性2、额外写一个style,不加scoped(vue支持多个style)<divclass="mainText-body"contenteditable="true"></div><stylelang="less"scoped>//删除......
  • helm安装mysql8.0集群模式
    1.安装operator:MysqlCluster2.使用operator安装mysql8.0集群 CREATEUSER'root'IDENTIFIEDBY'134er6';ALTERUSER'root'@'%'IDENTIFIEDBY'Qwer#@!';apiVersion:mysql.radondb.com/v1alpha1kind:MysqlClusterme......
  • 插件模式架构图
    实现插件模式架构图前言在软件开发中,插件模式是一种常用的架构设计模式,它可以使代码具备可扩展性和灵活性,允许在不修改原有代码的情况下添加新功能或改变现有功能。本文将介绍如何实现插件模式架构图,帮助刚入行的开发者快速上手。整体流程下表展示了实现插件模式架构图的整体流......