设计模式—— 十 一:建造者模式

Builder Pattern(建造者模式/构造器模式/生成器模式 ) 与FactoryMethod Pattern(工厂方法模式)的区别 建造者模式与工厂方法模式都属于创建型设计模式,他们的应用环境都是在创建对象时运用。那他们的不同之处在哪里呢? 【宏观】 建造者模式比工厂模式关注的更加深入,工厂只关心把整体的对象创建出来,而建造者模式更加深入的关心了实例化的对象是如何一步一步按照流程(各子对象的组装算法)创建出来的,这个创建的流程(算法)是固定的,但可以创造出不同的表示(对象)。 工厂方法: 比如我们客户端想要盖一栋别墅,... 阅读详情

什么是建造者模式?

建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:

Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

建造者模式一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就 可以构建它们,用户不需要知道内部的具体构建细节。

建造者模式的通用类图如图11-1所示

图10-1:模板方法模式通用类图

在这里插入图片描述

在建造者模式结构图中包含如下几个角色:

● Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一 类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

●ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方 法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

●Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品 的内部表示并定义它的装配过程。

● Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽 象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装 配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建 造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥 者类的构造函数或者Setter方法将该对象传入指挥者类中。

建造者模式的通用源代码也比较简单。

  • Product(产品角色)
    在建造者模式的定义中提到了复杂对象,那么什么是复杂对象?简单来说,复杂对象是指那 些包含多个成员属性的对象,这些成员属性也称为部件或零件,如汽车包括方向盘、发动 机、轮胎等部件,电子邮件包括发件人、收件人、主题、内容、附件等部件
复制代码
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">Product</span> { 
	<span style="color:#a626a4">private</span> String partA; <span style="color:#a0a1a7"><em>//定义部件,部件可以是任意类型</em></span>
	<span style="color:#a626a4">private</span> String partB; 
	<span style="color:#a626a4">private</span> String partC;
	<span style="color:#a0a1a7"><em>//省略getter、setter方法</em></span>
	
}
</code></span></span>

  • Builder(抽象建造者)
    在抽象类Builder中声明了一系列抽象的buildPartX()方法用于创建复杂产品的各个部件,具体 建造过程在ConcreteBuilder中实现,此外还提供了工厂方法getResult(),用于返回一个建造好的完整产品。
复制代码
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">Builder</span> {
	<span style="color:#a0a1a7"><em>//创建产品对象</em></span>
	<span style="color:#a626a4">protected</span> Product product=<span style="color:#a626a4">new</span> <span style="color:#4078f2">Product</span>(); 
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">buildPartA</span>(); 
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">buildPartB</span>(); 
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">buildPartC</span>(); <span style="color:#a0a1a7"><em>//返回产品对象 </em></span>

	<span style="color:#a626a4">public</span> Product <span style="color:#4078f2">getResult</span>() {
		<span style="color:#a626a4">return</span> product;
	}
}
</code></span></span>

  • ConcreteBuilder(具体建造者)
    在ConcreteBuilder中实现了buildPartX()方法,通过调用Product的setPartX()方法可以给产品对象 的成员属性设值。不同的具体建造者在实现buildPartX()方法时将有所区别,如setPartX()方法 的参数可能不一样,在有些具体建造者类中某些setPartX()方法无须实现(提供一个空实 现)。而这些对于客户端来说都无须关心,客户端只需知道具体建造者类型即可。
复制代码
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">ConcreteProduct</span> <span style="color:#a626a4">extends</span> <span style="color:#4078f2">Builder</span>{

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">buildPartA</span>() {
		<span style="color:#a0a1a7"><em>//具体实现</em></span>
	}

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">buildPartB</span>() {
		<span style="color:#a0a1a7"><em>//具体实现</em></span>
	}

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">buildPartC</span>() {
         <span style="color:#a0a1a7"><em>//具体实现</em></span>
	}

}
</code></span></span>

  • Director(指挥者)
    指挥者类Director主要有两个作用:一方面它隔离 了客户与创建过程;另一方面它控制产品的创建过程,包括某个buildPartX()方法是否被调用 以及多个buildPartX()方法调用的先后次序等。指挥者针对抽象建造者编程,客户端只需要知 道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对 象。在实际生活中也存在类似指挥者一样的角色,如一个客户去购买电脑,电脑销售人员相 当于指挥者,只要客户确定电脑的类型,电脑销售人员可以通知电脑组装人员给客户组装一 台电脑。
复制代码
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">Director</span> {
	<span style="color:#a626a4">private</span> Builder builder;

	<span style="color:#a626a4">public</span> <span style="color:#4078f2">Director</span>(Builder builder) {
		<span style="color:#c18401">this</span>.builder = builder;
	}

	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">setBuilder</span>(Builder builder) {
		<span style="color:#c18401">this</span>.builder = builder;
	}
	
	<span style="color:#a0a1a7"><em>//产品构建与组装方法 </em></span>
	<span style="color:#a626a4">public</span> Product <span style="color:#4078f2">construct</span>() { 
		builder.buildPartA();
		builder.buildPartB(); builder.buildPartC();
		<span style="color:#a626a4">return</span> builder.getResult();
	}
}
</code></span></span>

导演类起到封装的作用,避免高层模块深入到建造者内部的实现类。当然,在建造者模 式比较庞大时,导演类可以有多个。

建造者模式优缺点

优点

● 封装性 使用建造者模式可以使客户端不必知道产品内部组成的细节。

● 建造者独立,容易扩展 BenzBuilder和BMWBuilder是相互独立的,对系统的扩展非常有利。

● 便于控制细节风险 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任 何影响。

缺点

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

● 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。

建造者模式的应用场景

  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
  • 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过 程封装在指挥者类中,而不在建造者类和客户类中。
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
设计模式C++实现(6)——建造者模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大 阅读详情

相关推荐

RT-2(robotics-transformer2)论文--阅读笔记

谷歌RT-2机器人论文的阅读笔记。

weixin_61255639的博客 1831

设计模式内容分享(三):构造器模/建造者模式

建造者模式的使用场合是当创建复杂对象时,把创建对象成员和装配方法分离出来,放在建造者类中去实现,客户端使用该复杂对象时,不用理会它的创建和装配过程,只关心它的表示形式。

之乎者也·的博客 1179

合成孔径雷达Chirp Scaling(CS)算法MATLAB仿真实现

本人也是初学《合成孔径雷达成像算法与实现》,在GitHub上下载的关于CS算法的代码,仔细读了读,发现中间有一些不合理之处,动手改了一改,重新写了一个代码供初学者学习,有什么问题留言即可。 非常感谢源代码的作者,虽然中间有少许不正确的地方,但是对我理解cs算法的帮助非常大,非常感谢!!! 代码中提到的(4.31)这种均是在《合成孔径雷达成像算法与实现》中的公式 以下是MATLAB的仿真程序,直接复...

weixin_41700188的博客 7854

常用的设计模式

写代码时常用的设计模式

qq_38361229的博客 315

机器学习kaggle案例:风控评分卡模型(Give_Me_Some_Credit)

kaggle链接:https://www.kaggle.com/c/GiveMeSomeCredit ipynb文件:https://github.com/824024445/KaggleCases/blob/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0kaggle%E6%A1%88%E4%BE%8B%EF%BC%9A%E9%A3%8E%E6%8E%A7%...

weixin_42662126的博客 1万+

三维重建(6)之双目视觉系统设计及测量误差估计

双目视觉系统设计及误差分析 参考:双目视觉系统标定方法的研究 – 殷文茜下边建立汇聚式双目立体视觉系统的理论误差模型 参考:基于双目视觉的曲面条形码图像采集装置设计 – 智少宇 工业相机举例:.................................

yohnyang的博客 3393

JAVA23种设计模式(4):建造者模式

23种设计模式介绍:https://mp.youkuaiyun.com/postedit/90552052 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 1.1 意图 在软件开发过程中有时需要创建一个...

sinat_35566306的博客 380

如何配置SSC CANopen的excel文件

如何配置 CANOpen 的 EXCEL 文件

PI_sunyang的博客 3704

深入理解设计模式-建造者模式(生成器模式)

文章目录一、什么是建造者模式二、使用场景三、简单建造者模式四、传统建造者模式结尾 一、什么是建造者模式 建造者模式也称为生成器模式(英文:Builder Pattern),他可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。 二、使用场景 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。 当一个类的构造函数参数超过4个,而且这些参数有些是可选的时,我们通常有两种办法来构建它的对象。 例如我们现在有如下一个类计算机类Compute

少说,多做 1万+

【PyGIS】ERA5降雨蒸散发数据预处理

ERA5-LAND降雨蒸散发数据预处理

```On Earth, Be Water, By Coding``` 3146

华为昇腾云平台适配Baichuan2大模型记录

文件发现报错:ValueError: The pipeline stage 2 in auto_parallel_context is not equal to the pipeline_stage 1 in the config.run_baichuan2_7b.yaml`,发现默认设备数是16卡,对应的pipeline_stage为2,但实际是8卡,那就改成下面的试试看。,将Baichuan2_7B_Chat.ckpt文件复制进去,将。点击镜像管理,突然发现有个2_2_0,赶紧新建了一个,成功。

羊城迷鹿的博客 2393

【专题系列】搞定设计模式之—— 十 一:建造者模式

点击上方“java大数据修炼之道”,选择“设为星标”优质文章, 第一时间送达来源 |https://www.cnblogs.com/three-fighter/p/12650023.h...

hello world! 393

Coze智能体开发:扣子空间制作PPT功能

扣子空间内置了丰富的场景模板,涵盖人文历史、学术分享、研究报告、数据分析等场景,可以满足不同用户的需求。 你只需输入与制作 PPT 相关的提示词,Agent 就能基于这些提示词展示思考的过程,并自动生成完整的 PPT。

王国平的博客 2054

设计模式—建造者模式及实例(BuilderPattern)

建造者模式(Builder Pattern)也称生成器模式,它属于创建型模式。

小嵩的博客 4003

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

设计模式之建造者模式

设计模式之建造者模式

来自上海的这位朋友 2053

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式——建造者模式

又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。2)、构造者模式,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。3)、构造者模式主要解决在软件系统中,当面临一个复杂对象的创建工作时,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临剧烈的变化,但是将它们组合在一起的算法却相对稳定。

程序猿进阶 1775

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

DesignPattern设计模式

本文主要介绍了设计模式相关内容。包括软件设计的SOLID原则,设计模式的分类,单例模式的思想与实现,工厂模式的思想与实现,建造者模式的思想与实现,代理模式的思想与实现,责任链模式的思想与实现等内容。供个人学习使用。

专注Java和MySQL领域知识分享 1887

【设计模式系列】建造者模式(十)

建造者模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。它将一个复杂对象的构建和表示分离,使得同样的构建过程可以创建不同的表示。

LHW0621的专栏 1579

【设计模式】Java 设计模式之建造者模式(Builder Pattern)

建造者模式是一种强大的设计模式,它通过抽象化对象的构建过程,提高了代码的可读性、可维护性和可扩展性。该模式适用于需要创建复杂对象且创建过程需要灵活调整的场景。通过定义建造者接口和指挥者类,我们可以将对象的构建逻辑与使用逻辑分离,使得代码更加清晰和易于维护。此外,建造者模式还支持创建多种表示的产品,增强了系统的灵活性。在实际应用中,我们可以根据需求选择合适的建造者模式变种和扩展应用方式,如带有默认值的建造者或链式调用的建造者。未来,随着软件系统的复杂度增加,建造者模式的应用将更加广泛,我们需关注其性能问题和设

新手村长的专栏 4596

肝一肝设计模式【四】-- 建造者模式

建造者模式将创建一个对象的实例和成员变量的赋值相分离,使用多个简单的对象一步一步构建成一个复杂的对象,让对象的构建过程变得更加可控和易于管理,提供了更好的封装性、灵活性和可复用性。

老六说编程的博客 1382

设计模式之建造者模式(BuilderPattern)

一.意义 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 说明:复杂对象的构建,比如一个对象有几十个成员属性,那么我们在创建这个对象,并给成员属性赋值时,就会很麻烦。采用建造者模式,就是把创建对象并给成员属性赋值的工作,分离出来,由建造者角色来完成,业务程序员直接调用导演类,获得复杂对象即可,无需再进行对象的创建工作了。 二.角色 建造者模式涉及到一下几种角色: Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方

敲代码的小小酥的博客 415

Python设计模式:建造者模式

什么是建造者模式 创建一个由多个部分构成的对象,而且构成需要一步步完成只有当各部分都创建好,这个对象才算是完整的。 此模式有两个参与者:建造者和指挥者 建造者负责创建复杂对象的各个组成部分 指挥者是使用一个建造者实例控制建造的过程 使用场景 知道一个对象必须经过多个步骤来创建,并且要求同一个构造过程可以产生不同的表现,就可以使用建造者模式 建造者模式和工厂模式的差别: 工厂模式以单个步骤创建对象,...

生活屁颠过的博客 2万+

彻底搞懂设计模式DesignPattern-建造者模式

基本介绍 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们, 用户不需要知道内部的具体构建细节。 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。 方便用户创建复杂的对象(不需要知道实现过程) 代码复用性 & 封装性(将对象构建过程和细节进

Ping 421

Dart设计模式之建造者模式

在这里为了方便大家系统的学习Flutter,这里特意联合了阿里P7架构师和谷歌技术团队共同整理了一份Flutter全家桶学习资料。内容概要:Flutter技术解析与实战、Flutter进阶学习笔记、Flutter入门与实战和Flutter完整开发实战详解。内容特点:条理清晰,含图像化表示更加易懂。由于文章内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要 Flutter技术解析与实战 完整文档的可扫描下方卡片免费获取!

大模型学习路线 1033
上一篇: 设计模式—— 十 :模板方法模式
下一篇: 设计模式—— 十二 :代理模式
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值