[设计模式]建造者模式(Builder)

C++设计模式——Builder Pattern建造者模式 建造者模式,又被称为生成器模式,是一种创建型设计模式,它将复杂产品的构建过程分解为一系列简单的步骤,每个步骤由独立的建造者对象负责。建造者模式常用于创建复杂的对象,它避免了直接传递大量参数来构造函数,使得构建过程变得可控,让代码变得灵活和可维护。建造者模式允许开发者按照指定的步骤创建复杂对象,构建过程的细节被封装在具体建造者中,将创建对象的过程和表示对象的过程分离,且同一个构建过程可以使用不同的具体建造者以及不同的顺序来创建不同的表示。 阅读详情

1.      意图

       将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示。并且因为构建过程是标准化的,所以当需要标准化构建过程时也可以使用。

2.      结构与参与者


3.      效果

1) 它使你可以改变一个产品的内部表示

       Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。

2) 它将构造代码和表示代码分开

       Builder模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息。只要调用指挥者的接口就可以了。每一个ConcreteBuilder包含了创建和装配一个特定产品的所有代码。然后不同的Director可以复用它以在相同部件集合的基础上构造不同的产品(改变顺序)。

3) 对各过程进行更精细的控制

       Builder模式与一下子就生成产品的创建型模式不同,它是在指挥者的控制下一步一步构造产品的。仅在该产品完成时指挥者才从生成器中取回它。因此Builder接口相比其他创建型模式能更好地反应产品的构造过程。同时通过创建不同的指挥者,可以使得产品按不同的步骤进行生产。这可以说明Builder模式处理生产线产品,抽象工厂模式处理分系列产品。

4.      实现

1) 装配和构造函数

       生成器逐步的构造它们的产品。因此Builder类接口必须足够普遍,以便为各种类型的具体生成器构造产品。

2) 产品没有抽象类

       通常情况下,有具体生成器生成的产品,它们的表示区别是如此之大以至于给不同的产品以公共父类没有太大意思。

3) 在Builder类中缺省的方法为空

       C++中,生成方法故意不声明为纯虚成员函数,而是将它们定义为空方法,这样没有强制修改所有的生成方法,只选用足够的步骤进行修改就可以了。(想想纯虚函数与虚函数的区别)。

5.      代码示例

       一个按步骤创建摩托车、普通汽车、加强型汽车的例子:

#include <iostream>
#include <vector>
#include <string>
#pragma  warning (disable: 4786)  //忽略警告C4786
using namespace std;
//Product类
class Vehicle
{
private:
	vector<string> m_vpart; 
public:
	void AddPart(string str)
	{
		m_vpart.push_back(str);
	}
	void Show()
	{
		cout << "Vehicle parts:" << endl;
		for (vector<string>::iterator iter=m_vpart.begin();iter!=m_vpart.end();iter++)
		{
			cout << *iter <<endl;
		}
	}
};
//抽象Builder类
class VehicleBuilder
{
public:
	virtual BuildPartA(){}
	virtual BuildPartB(){}
	virtual BuildPartC(){}
	virtual Vehicle* GetResult(){return 0;}
};
//具体Builder类
class MotorCycleBuilder:public VehicleBuilder
{	
private:
	Vehicle* m_product;
public:
	MotorCycleBuilder()
	{
		m_product=new Vehicle;
	}
	virtual BuildPartA()
	{
		m_product->AddPart("MotorPartA");
	}
	virtual BuildPartB()
	{
		m_product->AddPart("MotorPartB");
	}
	virtual Vehicle* GetResult()
	{
		return m_product;
	}

};
//具体Builder类
class CarBuilder:public VehicleBuilder
{	
private:
	Vehicle* m_product;
public:
	CarBuilder()
	{
		m_product=new Vehicle;
	}
	virtual BuildPartA()
	{
		m_product->AddPart("CarPartA");
	}
	virtual BuildPartB()
	{
		m_product->AddPart("CarPartB");
	}
	virtual BuildPartC()
	{
		m_product->AddPart("CarPartC");
	}
	virtual Vehicle* GetResult()	
	{
		return m_product;
	}
};

//指挥者类,运用具体构造器的接口来标准化生成对象
class Director
{
public:
	void Construct(VehicleBuilder* builder)
	{
		builder->BuildPartA();
		builder->BuildPartB();
	}
};
//可以定义不同的指挥者类,这样的化可以选择
//组装不同的够造步骤,生成不同的产品
class DirectorPlus
{
public:
	void Construct(VehicleBuilder* builder)
	{
		builder->BuildPartA();
		builder->BuildPartB();
		builder->BuildPartC();
	}
};

//客户端
int main()
{
	CarBuilder* carBuiler=new CarBuilder;
	CarBuilder* carBuilerPlus=new CarBuilder;
	MotorCycleBuilder* motorBuilder=new MotorCycleBuilder;
	Director* dp=new Director;
	DirectorPlus* dpp=new DirectorPlus;
	dp->Construct(carBuiler);					//构建普通汽车
	Vehicle* car=carBuiler->GetResult();        
	dp->Construct(motorBuilder);			    //构建摩托车
	Vehicle* motor=motorBuilder->GetResult();   
	cout << "We build a ordinary car"<<endl;
	car->Show();
	cout << "We build a motorcycle"<<endl;
	motor->Show();
	dpp->Construct(carBuilerPlus);					//构建加强版的汽车
	Vehicle* carp=carBuilerPlus->GetResult();
	cout << "We build a enhanced car"<<endl;
	carp->Show();
	cout << "Program created by sicofield"<<endl;
	return 0;
}




ANSYS Products19.1下载及安装教程 ANSYS Products19.1下载及安装破解教程 前言 ANSYS软件是美国ANSYS公司研制的大型通用有限元分析(FEA)软件,是世界范围内增长最快的计算机辅助工程(CAE)软件,能与多数计算机辅助设计(CAD,computer Aided design)软件接口,实现数据的共享和交换,如Creo, NASTRAN、Algor、I-DEAS、AutoCAD等。ansys project包括一整套的软件集合,它耦合了CFD模型的前处理,求解器和后处理所需要的相关软件,特比是它的workbench模块, 阅读详情

相关推荐

VS Code ESP-IDF无法找到源文件、头文件波浪线解决

背景:想要编译小智AI项目,可以正常编译。但是一些头文件,例如#include <nvs.h>等无法找到。

Hot_Ant的博客 1490

java中的.builder()方法

构建对象,给属性赋值,可以 使用一个构造器; 一个空的构造器,然后使用setter方法进行设置。

duanmy的博客 6911

基于PCA的故障诊断方法(matlab)

1. PCA原理分析 PCA的原理主要是将原始数据进行降维。其具体工作原理参照:CodingLabs - PCA的数学原理 2. 数据预处理 训练数据集(只有正样本)为维数据,即有n个采样值,每个采样值有m个特征。 2.1 数据归一化 将数据X针对每个特征归一化为均值为0,均方根为1的数据。 其中: 3. PCA降维 3.1 首先求取协方差矩阵 协方差矩阵的公式为: 计算出来的协方差矩阵为特征m*m维矩阵。 3.2 求取特征值和特征向量 求取协方差矩阵R的特征值.

tangxianyu的博客 1万+

java中的.builder()方法实现详解

文章目录一。简介二。场景模拟三。java实现四。使用lombok插件进行优化 一。简介 1.我们在构建对象的时候,如果对象属性比较多,我们可以 使用一个构造器; 一个空的构造器,然后使用setter方法进行设置。 使用这些方法时会有冗长的构造函数或者setter方法,有不同参数默认值的构造函数需要多次定义,因此我们可以使用builder来简化代码的简介性。 2.那么什么是Builder呢? 它其实是一种设计模式,叫做建造者模式,它的含义是将一个复杂的对象的构建与它的表示分离,同样的构建过程可以创建不同

爱吃鸡腿的明仔 4万+

ResNet理论基础与具体实现(详细教程)

论文地址:Deep Residual Learning for Image Recognition ​ Identity Mappings in Deep Residual Networks pytroch源码地址:resnet 0x00 前言 ResNet是2015年就提出的网络结构,中文名字叫作深度残差网络,主要作用是图像分类。现在在图像分割、目标检测等领域都有很...

coordinate的博客 8331

QuickFix Java 讲解(五)消息的收发与查看

本系列力求手把手教你怎样利用QuickFix Java 搭建自己的 FIX 协议收发平台,以及其中的注意事项。 所有源码的地址(免费): https://github.com/zongzhec/QuickFixPractise 这节我们讨论将Acceptor和Initiator启动以后,收到的消息极其查看方式。 6. 收发双方的通信 6.1. 启动后的通信和登录 为方便起见,这里我们使用统一的源码:https://github.com/zongzhec/QuickFixPractise ..

2246

Builder建造者模式

Builder建造者模式

it__zhou的博客 1099

UE4 专用服务器搭建(UE4.27为例)

专用服务器、DS服务器

mimo134的博客 2775

JAVA中实现.builder().build()给字段赋值

在字段多的时候可以使用@Builder赋值,如果字段多使用NEW关键字在一些业务场景中每个字段都要set有时候还是挺烦人的。字段少的话还是使用NEW关键字吧。

qq_44705845的博客 5192

鱼鹰优化算法(OOA)详解:从猛禽捕食智能到优化算法实现

鱼鹰优化算法(Osprey Optimization Algorithm, OOA)是2023年提出的一种新型元启发式优化算法,灵感来源于鱼鹰(一种中型猛禽)高效的捕食策略。算法模拟了鱼鹰从空中识别水下鱼类位置并俯冲捕食,然后将捕获的鱼带至安全位置享用的全过程,以此抽象出全局探索和局部开发两个核心阶段。OOA算法具有参数少、结构简单、收敛速度快、全局寻优能力强等特点。自提出以来,已在函数优化、机器学习参数调优(如CatBoost模型)、路径规划等多个领域展现出良好性能,为解决复杂优化问题提供了新的有效工具。

qq_42212808的博客 273

一文就够-InfiniBand 技术全面解析:从原理到实践的通俗易懂指南

想象一下,在一个超级数据中心里,成千上万台服务器需要像蜜蜂群体一样高效协作。如果用传统的网络连接,就像让每只蜜蜂都排着队传递消息,效率极低。InfiniBand(简称 IB)就是为了解决这种 "通信拥堵" 而生的高速网络技术,它专门为高性能计算(HPC)、数据中心和云计算环境设计,就像给服务器之间搭建了多条高速公路,让数据可以飞驰而过。

jundao1997的专栏 1395

java中builder()方法的使用

1,实体类上加注解 @Builder 2,试用build构造器进行赋值 // 创建默认分组 MatchInfoGroupEntity matchInfoGroupEntity = MatchInfoGroupEntity.builder() .matchInfoId(dto.getId()) .groupName("默认分组") .matchType(dto.getGroupT

qq_25983579的博客 6952

vue3 - element-plus表格组件el-table实现鼠标拖曳排序功能,vue3 Table表格拖拽排序,表格每行使用鼠标拖动进行排序功能,表格拖拽排序实现(详细示例代码,一键复制开箱即用

vue3,elementPlus,el-table,typescript,表格组件,Table表格,表格拖动排序,表格拖曳排序,鼠标拖拽表格进行排序功能,elementplus表格如何实现拖动每行进行排序操作,表格拖动改变顺序,鼠标拖曳,表格内的数据项拖拽排序,vue3如何实现element-Plus表格组件进行表格内的数据项拖拽排序,列表拖拽排序效果,实现table动态拖拽,鼠标拖着排序,vue3 element Plus 表格拖曳拖动拖拽 排序,el-table拖拽排序实现,表格内容拖拽重新排序,树形表

✅ 精选推荐文章 1万+

Java 设计模式——建造者模式(Builder Pattern)

Java 设计模式——建造者模式(Builder Pattern) 一.简介 1.定义 将一个复杂对象的构建与它表示分离,使用同样的构建过程可以创建不同的表示 2.主要作用 在用户不知道对象建造过程和细节的情况下就可以直接创建复杂对象 3.如何使用 用户只需给出指定复杂对象的类型和内容,建造者模式负责按顺序创造对象(把内部建造过程和细节隐藏起来) 4.解决的问题 (1).方便用户创建复杂的对...

a158s168的博客 276

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设计模式:建造者模式(Builder Pattern)

建造者模式是一种创建型设计模式,它允许你分步骤创建复杂对象,使相同的构建过程可以创建不同的表示。;本质是 把"怎么装配"和"装成什么样"分离,让同样的装配流程可以生产不同"口味"的对象。

倔强老吕的博客 1687

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

设计模式-03建造者模式Builder Pattern

建造者模式摘要:建造者模式是一种创建型设计模式,用于分步骤构建复杂对象,使构建过程与对象表示分离。该模式适用于需要创建包含多个组成部分的对象,特别是当这些部分可选或构建顺序可变时。通过UML类图展示了经典建造者模式和链式建造者模式的结构差异,并提供了Java实现示例。实现方式包括通过Builder内部类分步骤设置对象属性,最后通过build()方法返回完整对象,使代码更清晰且避免构造器参数过多的问题。

d3y1`5 81_09 1205

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java设计模式|建造者模式Builder Pattern

Java设计模式|建造者模式Builder Pattern 前言: 在日常生活中,我们可能会遇到这一类型的需求,例如一个实体类里有很多个属性,但是我们只想要其中的几种组合成一个新的对象,这个时候就可以使用建造者模式了,它提供了一种创建对象的最佳方式。建造者模式虽然比较好用,但是大家平时写代码的时候要谨记,不要滥用设计模式,不然的话可能会适得其反啊! 建造者模式 介绍:建造者模式又被称呼为生成器模式,这种类型的设计模式属于创建型模式,使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它

QAQFyl的博客 547

【编程素质】设计模式—建造者模式(Builder Design Pattern,生成器模式,Builder Pattern)

1,概念 封装一个产品的构造过程并允许按步骤构造(有多个步骤,工厂模式只有一个步骤,所以两者不同),并可以改变过程。 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 2,场景 相同的方法,不同的执行顺序,产生不同的事件结果时; 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时; 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适; 3,类图 4,优缺点 1)优点 良好的封装性, 使用建造者模式可以使客户端不必知道产品内部

午后阳光 344

23种设计模式之建造者模式(Builder Pattern)

本篇文章将23种设计模式中的建造者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

设计模式|建造者模式(Builder Pattern)

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

weixin_44435110的博客 1440

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

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。何时使用:一些基本部件不会变,而其组合经常变化的时候。如何解决:将变与不变分离开。关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

weixin_42294716的博客 1316

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

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

新手村长的专栏 4595

秒懂设计模式之建造者模式(Builder pattern)

前言 人IT江湖飘,不懂设计模式咋装逼? 没实际写过5万行代码谈设计模式都是在瞎扯淡,咱先看看这定义 In software engineering, a software design pattern is a general, reusable solution to a commonly occurring problem within a given context in softwar...

ShuSheng007的程序人生 6586

Design-pattern 创建型设计模式-Builder建造者模式

建造者模式|构建者模式|生成器模式 实际上,建造者模式的原理和代码实现非常简单,掌握起来并不难,难点在于应用场景。 比如,你有没有考虑过这样几个问题:直接使用构造函数或者配合 set 方法就能创建对象,为什么还需要建造者模式来创建呢? 建造者模式和工厂模式都可以创建对象,那它们两个的区别在哪里呢? 当创建一个对象是,构造函数参数很多,并且参数之间有逻辑关系。此时构造函数列表列表变的很长,代码在可读性和易用性上变差。在使用构造函数的时候,容易搞错各参数的顺序。传递进去错误的参数值,导致非常隐蔽的bug

lixld的专栏 271

PHP设计模式之建造者模式(Builder Pattern)

一、什么是建造者模式 定义:建造者模式(Builder Pattern)又称生成器模式,是一种构建对象的模式。 1、它可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。 2、由于建造零件的过程很复杂,因此,这些零件的建造过程往往被“外部化”到另一个乘坐建造者的对象里,建造者对象返还给客户端的是一个全部零件都建造完毕的产品对象。它将产品的结构和建造过程对客户端隐藏起来。 【释义】 使用生活中的例子来解释建造者...

Albert_____的博客 375

【设计模式】建造者模式(Builder Pattern)详解

本文介绍了建造者模式在解决复杂对象创建问题中的应用。当构造函数参数过多导致可读性差、参数顺序易错时,建造者模式通过分步骤构建的方式提供解决方案。该模式包含产品类、抽象建造者、具体建造者和指挥者四个角色,核心思想是将对象的构建过程与表示分离。以计算机组装为例,演示了如何通过Builder类实现灵活的对象创建,并分析了该模式的优缺点:提升可读性、支持不可变对象,但会增加代码复杂度。最后指出建造者模式适用于属性多、构建步骤固定的场景,但不应滥用。文中还列举了JDK中StringBuilder等实际应用案例。

经天纬地,格物致理 997
上一篇: [设计模式]抽象工厂模式(AbstructFactory)
下一篇: [设计模式]工厂方法模式(Factory Method)
sicofield
博客等级 码龄18年 169粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值