[设计模式]建造者模式(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;
}




Apollo&Carla联合仿真环境搭建与实战调试 本文详细介绍了Apollo与Carla联合仿真环境的搭建与实战调试流程,涵盖硬件配置、软件依赖安装、Apollo环境配置、Carla仿真器安装、桥接服务设置以及常见问题解决方案。通过逐步指导,帮助开发者高效实现自动驾驶仿真测试,提升开发效率。 阅读详情

相关推荐

如何配置 OpenClaw 使用免费搜索工具:摆脱付费 API 限制

本文介绍了如何配置OpenClaw使用免费搜索工具来替代付费API。主要内容包括:1)启用内置的web_fetch工具直接获取网页内容;2)创建自定义脚本聚合免费AI资讯源;3)配置其他免费网络工具。文章详细说明了配置步骤,推荐了多个优质免费AI资讯网站,并分析了该方案的优劣势。这种配置方式完全免费且灵活,特别适合预算有限的用户,能够在不依赖付费API的情况下获取所需信息。

dongdeaiziji的专栏 9814

java中的.builder()方法

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

duanmy的博客 6911

python cartopy绘制扇形区域图/cartopy绘制北极部分区域

实际上,这个问题原因还是由于投影转换的问题,在set_extend时,绘制的上下边界仍然是方形、未被正确投影的边界,与我们的set_boundary存在冲突,最根本的原因还是在于cartopy对于投影计算的一些缺陷。另外我们需要指出的是:**该方法不适用于极地投影,即NorthPolarStereo,由于NorthPolarStereo本身投影特性只需一个参数,本身并不适合。我们绘制极地投影时,同样也是使用set_boundary绘制圆形边界,那么当我们想要绘制扇形时,可以通过。请根据喜好自行选择,

weixin_43750300的博客 3212

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

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

爱吃鸡腿的明仔 4万+

Plant Simulation数字孪生实战:从零搭建生产车间模型(附SimTalk脚本示例)

本文详细介绍了如何使用Plant Simulation从零构建生产车间数字孪生模型,包括基础建模、SimTalk脚本编程、参数化设计和高级应用。通过实战示例展示动态逻辑控制、设备故障模拟等关键技术,帮助工程师快速掌握数字孪生技术在制造业中的应用。

weixin_42527160的博客 359

Chatbox使用指南

Chatbox使用指南

weixin_65289420的博客 2万+

Builder建造者模式

Builder建造者模式

it__zhou的博客 1099

避坑指南:C#用S7NetPlus读写西门子PLC字符串(String/WString)的完整方案

本文详细解析了C#通过S7NetPlus读写西门子PLC字符串(String/WString)的完整方案,包括内存布局、编码差异和字节序处理等关键技术细节。提供了实战优化的代码示例和常见问题排查指南,帮助开发者避免乱码、截断等常见陷阱,提升工业自动化项目的开发效率。

weixin_32956805的博客 320

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

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

qq_44705845的博客 5192

Python 爬虫实战:美团大众点评餐厅数据爬取与分析

本文摘要:美团/大众点评餐厅数据爬虫实战指南 本文详细介绍了如何开发一个完整的餐厅数据爬虫系统,涵盖从环境配置到数据可视化的全流程。主要内容包括: 项目目标:爬取餐厅基本信息(名称、评分、价格等)及详情数据,支持市场分析和商业决策 技术方案:使用Python生态工具(Requests、Playwright、Pandas等)构建爬虫系统 核心挑战:破解大众点评的字体反爬机制和美团的API签名验证 实现细节:提供完整的代码示例,包括字体解析、签名生成、请求重试等关键功能 数据应用:支持将结果导出为CSV/Exc

u014481728的博客 317

医院批量排班实战指南(三)日期列表生成与时段批量操作

在上一篇《批量排班功能实现指南(二):日期与时段设置》中,我们完成了日期范围选择和重复规则配置的界面搭建,实现了从第一步到第二步的跳转功能。现在我们已经可以选择日期范围和重复规则,但还缺少最关键的功能——根据规则生成日期列表并进行时段配置。本篇将继续深入批量排班的核心功能——日期列表生成与时段批量操作。根据日期范围和重复规则智能生成日期列表为每个日期配置上午、下午、夜诊时段批量时段操作提升配置效率日期列表的展示与管理。

低代码布道师的博客 1346

java中builder()方法的使用

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

qq_25983579的博客 6952

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

视觉人机器视觉的博客 1741

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

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

a158s168的博客 276

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

倔强老吕的博客 1687

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

d3y1`5 81_09 1205

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值