[设计模式]创建模式-建造者(C++描述)

设计模式C++实现(6)——建造者模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大 阅读详情

[设计模式]创建模式-建造者(C++描述)

second60 20180426

1. 什么是建造者模式

 

当创建的对象很复杂,由多个其他对象组合而成时,我们要对复杂的对象的创建过程进行分离,通过一步一步来对复杂对象的构建,每一步构造过程可以引入参数,使得相同步骤创建最后得到不同的对象。

 

一句话总结:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

 

作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象

 

解决的问题:

1. 创建复杂对象无须知道实现过程

2. 对象的构建过程和细节封装

2. 建造者模式图

 

模式讲解:

1. 指挥者(Director)类和客户沟通

2. 指挥者将创建产品的需求划分成备个部件的建造Builder

3. 各部件的建造委派到具体的建造者ConcreteBuilder

4. ConcreteBuilder负责产品的构建

5. 最终构建成具体的产品Product

 

3. 实例讲解

最晚就开始写建造者模型,今天一直在想,怎么来讲解比较好呢?以前虽然用进,但场景忘记是哪里出现过了。所以今天想了一天,想了个可以运用的实例。最近棋牌很火,就以棋牌为例。

 

在棋牌中,有很多的子游戏,如:麻将类,牌类,棋类。这里就以麻将类为例,其他类通用。麻将中,又分各个地区的,如:广东麻将,四川麻将,济南麻将等。这里就以这三个麻将为例,进行创建者模式讲解麻将流程的创建。

 

3.1 分析

1. 无论什么麻将,他们的流程是有差异的。比如:

a) 广东麻将流程:定庄->发牌->牌局摸打->牌局结束->结算

b) 四川麻将流程:定庄->发牌->定缺->换三张->牌局摸打->牌局结束->查花猪大叫->结算

c) 济南麻将流程: 定庄->发牌->飘->明楼->牌局摸打->牌局结束->结算

2. 整个牌局过程是有一定的流程的,为了自动化构建或个牌局流程,采用建创者模式构造好流程,然后程序按流程跟逻辑即可实现一个可配置,可通用的麻将流程

 

3.2具体实现方法

0. 麻将流程名定义

enum EMahjongProcedure

{

EMahjongProcedure_DingZhang = 1,// 定庄

EMahjongProcedure_FaPai ,// 发牌

EMahjongProcedure_DingQue,//定缺

EMahjongProcedure_HuanSanZhang,//换三张

EMahjongProcedure_Piao,//飘

EMahjongProcedure_MingLou,//明楼

EMahjongProcedure_Game,牌局摸打

EMahjongProcedure_GameOver,//牌局结束

EMahjongProcedure_JieSuan,//牌局结算

EMahjongProcedure_HuaZhu,//花猪

EMahjongProcedure_DaJiao,//大叫

}

 

1. 首先,有个麻将游戏流程的产品,棋类,牌类通用,名为:GameProcedure

class  GameProcedure

{

public:

void addProcedure(EMahjongProcedure eProcedure)

{

int nowSize = _mapProcedureName.size();

_mapProcedure[nowSize+1] = eProcedure;

}

private:

std::map<int,int> _mapProcedure;

};

 

2. 有一个抽象建造者类,游戏抽象建创者,GameBuilder

class  GameBuilder

{

public:

virtual ~GameBuilder(){}

virtual void builderDingZhang() = 0;// 定庄

virtual void builderFaPai() = 0;//发牌

virtual void builderDingQue() = 0;//定缺

virtual void builderHuanSanZhang() = 0;//换三张

virtual void builderPiao() = 0;//飘

virtual void builderMingLou() = 0;//明楼

virtual void builderGame() = 0;//牌局摸打

virtual void builderGameOver() = 0;//牌局结束

virtual void builderJieSuan() = 0;//牌局结算

virtual void builderHuaZhu() = 0;//花猪

virtual void builderDaJiao() = 0;//大叫

 

virtual GameProcedure* getGameProcedure() = 0;

//有新流程继续添加

};

 

3. 建造者实现类,MahjongGameBuilder

class MahjongGameBuilder: public GameBuilder

{

public:

MahjongGameBuilder()

{

_ptrGameProcedure = new GameProcedure();

}

void builderDingZhang()

{// 定庄

_ptrGameProcedure->addProcedure(EMahjongProcedure);

}

void builderFaPai()

{//发牌

_ptrGameProcedure->addProcedure(EMahjongProcedure_FaPai);

}

void builderDingQue()

{

_ptrGameProcedure->addProcedure(EMahjongProcedure_DingQue);

}

void builderHuanSanZhang()

{

_ptrGameProcedure->addProcedure(EMahjongProcedure_HuanSanZhang);

}

void builderPiao()

{

_ptrGameProcedure->addProcedure(EMahjongProcedure_Piao);

}

void builderMingLou()

{

_ptrGameProcedure->addProcedure(EMahjongProcedure_MingLou);

}

void builderGame()

{

_ptrGameProcedure->addProcedure(EMahjongProcedure_Game);

}

void builderGameOver()

{

_ptrGameProcedure->addProcedure(EMahjongProcedure_GameOver);

}

void builderJieSuan()

{

_ptrGameProcedure->addProcedure(EMahjongProcedure_JieSuan);

}

void builderHuaZhu()

{

_ptrGameProcedure->addProcedure(EMahjongProcedure_HuaZhu);

}

void builderDaJiao()

{

_ptrGameProcedure->addProcedure(EMahjongProcedure_DaJiao);

}

GameProcedure* getGameProcedure()

{

return _ptrGameProcedure;

}

private:

GameProcedure* _ptrGameProcedure;

};

 

4. 指挥者类,这里是麻将指挥者 MahjongDirector,棋类指挥者和牌类指挥者另建。

 

class MahjongDirector

{

public:

MahjongDirector(){}

MahjongDirector::~MahjongDirector(){}

 

//广东麻将流程

GameProduce* constructGuangDongMahjong(Builder* builder)

{

builder->builderDingZhang();

builder->builderFaPai();

builder->builderGame();

builder->builderGameOver();

builder->builderJieSuan();

return builder->getGameProcedure();

}

//四川麻将流程建造

GameProduce* constructSiChuangMahjong(Builder* builder)

{

builder->builderDingZhang();

builder->builderFaPai();

builder->builderDingQue();

builder->builderHuanSanZhang();

builder->builderGame();

builder->builderGameOver();

builder->builderHuaZhu();

builder->builderDaJiao();

builder->builderJieSuan();

return builder->getGameProcedure();

}

 

//济南麻将流程建造

GameProduce* constructJiNanMahjong(Builder* builder)

{

builder->builderDingZhang();

builder->builderFaPai();

builder->builderPiao();

builder->builderMingLou();

builder->builderGame();

builder->builderGameOver();

builder->builderHuaZhu();

return builder->getGameProcedure();

}

//新加大连麻将

GameProduce* constructDaLianMahjong(Builder* builder)

{

builder->builderDingZhang();

builder->builderFaPai();

builder->builderGame();

builder->builderGameOver();

return builder->getGameProcedure();

}

private:

Builder* _builder;

};

 

5. 麻将流程的生成

int main()

{

MahjongDirector* director = new MahjongDirector();

MahjongGameBuilder *gd_builder= new MahjongGameBuilder();

MahjongGameBuilder *sc_builder= new MahjongGameBuilder();

MahjongGameBuilder *jn_builder= new MahjongGameBuilder();

MahjongGameBuilder *dl_builder= new MahjongGameBuilder(); //新加大连麻将


GuangDongMahjong* gdMahjon = director.constructGuangDongMahjong(gd_builder);

GuangDongMahjong* scMahjon = director.constructSiChuangMahjong(sc_builder);

GuangDongMahjong* jnMahjon = director.constructJiNanMahjong(jn_builder);

GuangDongMahjong* dlMahjon = director.constructDaLianMahjong(jn_builder);//新加大连麻将

//释放指针

return 0;

}

6分析

a) 在这里创建了广东,四川,济南在个麻将流程,里面的具体流程细节是不一样的,用户创建麻将无须知道细节,只需创建相应地区即可。

b) 如果新加一个麻将,如果有新麻将,在Director中新加一个流程函数即可。新流程也要添加,但当流程非常完善时,新加麻将,只需加建造细节。constructXXXMahjong

 

可能有人会问:这里创建了麻将流程有什么用呢?

好处大着呢,如果全国有一万种不同的地方麻将,那么就有一万种麻将流程。流程大部份都是通用的,才写好了逻辑。如果新增一个新麻将,那么只需指挥者组装即可。

 

这里的流程,给程序按序列去执行,自动启关定时器,那么,就能实现一个通用的麻将游戏。即你想什么打法的麻将都可以,只需组装流程,就可以实现千千万万种的麻将,包括新创造的麻将流程玩法。够强大了吧。

 

4总结

今天想了一天,再想这个麻将流程的建造者实现方法,这里只是给出流程的拼装,非常通用,说明了建造者不用关心建造的具体细节,复杂的细节,就可以建造出各种各样复杂的产品。

一般来说,建造者用来复杂多变的产品上,同时又无须关心具体的实现细节。为使用者提供了一个简单的创建过程。同时具有良好的扩展性和复用性。是创建者模型中,应对复杂多变产品,为优选。

 

下一章节内容为原型模式,也就是对象的复制克隆。

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

相关推荐

NLP DAY1: 文本数据读取

txt 文本数据的读写CSV 及 Excel 文本数据的读写更多的 DataFrame 操作数据规模太大怎么办相信通过本次实验的学习,同学们可以游刃有余地面对各种数据文件了。在接下来的实验中,我们将开始真正地开启自然语言处理之旅,开始认识并熟悉一些常见的针对文本本身的预处理操作。

feifeikon的博客 1060

5.4 建造者模式(Builder Pattern)

建造者模式

NorthStar的博客 407

云漾AI创作平台实战:如何用GPT4.0+Midjourney快速生成商业级插画(附Prompt模板)

本文详细介绍了如何利用云漾AI创作平台结合GPT4.0和Midjourney快速生成商业级插画。通过智能文案生成与视觉化工作流,大幅提升创作效率,适用于电商、社交媒体等多种场景。文章包含实用Prompt模板和参数调整技巧,帮助设计师和内容创作者高效产出专业插画。

weixin_29251567的博客 219

创建型模型——建造者模式(Builder Pattern)

建造者模式我的理解使用的场景设计实现有抽象的建造者实现方式无抽象的建造者两种不同的建造者适用范围实际应用多参数方法改良(面试可以说)和抽象工厂的区别 我的理解 建造者模式,属于创建型设计模式的一种。顾名思义,就像建房子一样,需要层层组装,一个一个的设置部件,最后返回一个完整的对象。 第一:用来创建复杂对象的 第二:对客户端隐藏了产品复杂的创建细节 第三:就像建房子一样,建造者模式强调层层组装,最后...

qq_34352013的博客 539

Blender地形建模实战:5步搞定Gazebo仿真地形(附避坑指南)

本文提供了一份详细的Blender地形建模实战指南,旨在帮助开发者快速创建Gazebo仿真地形。文章通过五个核心步骤,从环境准备、地形雕刻、模型优化导出,到创建Gazebo模型包及问题排错,系统讲解了如何将Blender中的地形模型成功导入Gazebo进行机器人仿真,并重点分享了关键的避坑经验。

weixin_28475533的博客 345

手把手教你使用YOLOv11模型,训练自己数据集,百分百成功(无废话)

YOLOV11百分百成功训练自己的数据集并进行图像、视频流脚本预测

chenhenGzzz的博客 1952

14、建造者模式

建造者模式   1、定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。   2、结构部    产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。 抽象建造者:引入抽象...

wangmuduxingxia2的博客 196

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了。

吻等离子的博客 2872

设计模式系列之 建造者模式

建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 介绍 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 主要解决:主要解决在软件系统中,有时...

灯塔的优快云博客 414

Codex 100个真实案例 - 用AI批量清洗Excel脏数据(10万行3分钟搞定)

每个做数据分析的人都被"脏数据"折磨过——空值、重复行、日期格式五花八门、手机号多一位少一位……手动清洗几千行就已经让人崩溃,更别提10万行了。本文将展示如何用 Codex 生成一套完整的 Python pandas 数据清洗工具,从读取Excel/CSV、识别脏数据、自动清洗、生成清洗报告,到可视化对比清洗前后的数据质量,全程自然语言驱动,10万行数据3分钟搞定!

yueyeguzhuo的专栏 88

基于STM32的智能婴儿床设计(蓝牙通信+摄像头监控)_315

本项目设计并实现了一款基于STM32微控制器的智能婴儿床系统,通过多种传感器和智能控制模块为家长提供更便捷和高效的婴儿照护解决方案。系统包括婴儿哭泣检测、湿度监测、空气质量检测、温度监控等多项功能,并通过蓝牙与手机APP进行数据传输和远程控制。婴儿床内置摇摇床和安抚音乐播放功能,能够在婴儿哭泣时自动启动摇摇床并播放安抚音乐。此外,系统还支持摄像头远程监控,让家长实时查看婴儿的状态。整个系统采用STM32F103RCT6作为核心控制单元,结合声音传感器、湿度传感器、MQ135空气质量传感器。

865

Java设计模式之 建造者模型,简单易于理解

建造者模型 一、概念: 建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 实用范围: 1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2 当构造过程必须允许被构造的对象有不同表示时。 折叠角色 在这样的设计模式中,有以下几个角色: 1 builder:为创建一个产品对象的各个部件指定抽象接口。 2 ConcreteB...

阿火 675

RK3568平台开发系列讲解:内核启动流程

第 493 行的 ENTRY 指明了了 Linux 内核入口,入口为stext,stext 定义在文件arch/arm/kernel/head.S 中 , 因此要分析Linux 内核的启动流程,就得先从文件arch/arm/kernel/head.S 的 stext 处开始分析。_mmap_switched 定义在文件 arch/arm/kernel/head-common.S,__mmap_switched 最终会调用 start_kernel 函数。⑥、r2=atags 或者设备树(dtb)首地址。

内核笔记 217

C++ 设计模式之建造者模式

每个组件可能有不同的型号、配置和制造,这个时候计算机就可以被视为⼀个复杂对象,构建过程相对复杂,⽽我们使⽤建造者模式将计算机的构建过程封装在⼀个具体的建造者类中,⽽指导者类则负责指导构建的步骤和顺序。同时有⼀个指导者类负责协调建造者的⼯作,按照⼀定的顺序或逻辑来执⾏构建步骤,最终⽣成产品。对应的,建造者模式适⽤于复杂对象的创建,当对象构建过程相对复杂时可以考虑使⽤建造者模式,但是当产品的构建过程发⽣变化时,可能需要同时修改指导类和建造者类,这就使得重构变得相对困难。

K1_uestc的博客 1349

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++设计模式-建造者模式

目录 基本概念 代码与实例 基本概念 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们装配方式时适用的模式。 下面给出一个UML实例: 代码与实例 程序运行截图如下: 源码如下: Head.h #include ...

IT1995的博客 5639

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

本文介绍了Builder设计模式,从意图、问题到解决方案,详细讲解其应用场景与实现方法,并分析了优缺点及与其他设计模式的关系。文中通过C++代码示例(main.cc)和执行结果(Output.txt),清晰展示了如何使用Builder模式构建复杂对象

No Game No Life 1871

WINCC7.3破解文件

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

【再谈设计模式】建造者模式~对象构建的指挥家

建造者设计模式在处理复杂对象创建方面有着独特的优势,通过合理的运用可以提高代码的质量和可维护性,并且在需要定制化创建对象的场景下非常实用。

wnm23的专栏 1348

C++ 设计模式——建造者模式

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

慢慢记录,慢慢更新。 2168

C++设计模式|创建型 4.建造者模式

建造者模式(也被成为生成器模式),是一种创建型设计模式,软件开发过程中有的时候需要创建很复杂的对象,而建造者模式的主要思想是将对象的构建过程分为多个步骤,并为每个步骤定义一个抽象的接口。具体的构建过程由实现了这些接口的具体建造者类来完成。同时有一个指导者类负责协调建造者的工作,按照一定的顺序或逻辑来执行构建步骤,最终生成产品。举个例子,假如我们要创建一个计算机对象,计算机由很多组件组成,例如 CPU、内存、硬盘、显卡等。每个组件可能有不同的型号、配置和制造,这个时候计算机就可以被视为一个复杂对象,构建过程相

Brillian123的博客 1109

C++设计模式之创建型模式:建造者模式(Builder)

建造者模式是一种创建型设计模式,通过将复杂对象的构建与表示分离,实现分步灵活创建不同配置的对象。该模式包含产品、抽象建造者、具体建造者和指挥者四个核心角色:产品定义复杂对象的组成,抽象建造者声明构建接口,具体建造者实现部件组装,指挥者控制构建流程。以电脑组装场景为例,游戏本和办公本通过相同构建流程生成不同配置的产品。建造者模式的核心优势在于解耦构建与表示、灵活定制产品、控制构建细节和隐藏创建过程,适用于需要分步创建多部件对象的场景。与工厂模式相比,建造者模式更关注对象的逐步构建过程,而工厂模式侧重对象的整体

bkspiderx的博客 1321

设计模式C++生成器(建造者模式)

分类:(对象)创建型 问题: 1.构造一个房屋,需要考虑是否有车库,游泳池,花园,雕塑等,需要对诸多成员变量进行初始化工作.都写在构造函数里?每种都可能创建一个新的类? 2.相同的步骤需要能够产生不同的产品,例如使用木头和玻璃盖出来的是普通住房.用黄金和水晶建造出来的是宫殿. 解决方案:讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.即将对象构造代码从产品类中抽取出来,并将其放在一个名为Builder的独立对象中.

thank86的博客 2040

设计模式回顾——建造者模式(C++)

建造者模式是将一个复杂化对象的构造过程与其产品对象本身解耦,使得同样的构建过程可以创建不同的产品。

只要思想不滑坡,想法总比问题多。 991

设计模式之建造者模式(C++实现)

建造者模式介绍,包括应用场景,优缺点,模式结构,类图 以及 C++代码示例

墨1024 1315

C++ · 设计模式 (对象创建= Builder<建造者模式>)

建造者模式是一种创建型设计模式,主要用于构建复杂对象。其核心思想是将对象的构建过程与对象本身分离,使相同的构建过程可以创建不同的表示。该模式适用于需要分步构建、有多种配置或不同表现形式的复杂对象,如电脑配置、文档生成等场景。在C++实现中,建造者模式通常包含指导者(Director)、抽象建造者(Builder)、具体建造者(ConcreteBuilder)和产品(Product)四个角色,通过分离构建逻辑与产品实现,提高代码的灵活性和可维护性。该模式特别适合处理多参数构造、复杂初始化等场景,但不适用于简单

qq_35223555的博客 809

【第四节】C++设计模式(创建型模式)-Builder(建造者)模式

核心思想Builder 模式的核心思想是将复杂对象的构建过程分解为多个步骤,并通过一个指导者(Director)对象来协调这些步骤。这样做的好处是:构建过程与表示分离:对象的构建过程独立于其最终表示,使得相同的构建过程可以生成不同的对象。灵活性:通过在每一步骤中引入参数,可以灵活地调整对象的构建过程。适用场景Builder 模式适用于以下场景:需要创建的对象非常复杂,由多个部分组成。对象的构建过程需要分步骤进行,且每个步骤可能需要不同的参数。

攻城狮7号的博客 2008

C++设计模式之创建型模式

我们一定要牢记设计模式是前人总结的一套可以有效解决问题的经验,不要一写代码就在考虑该使用什么设计模式,这是极其不可取的。正确的做法应该是在实现业务需求的同时,尽量遵守面向对象设计的六大设计原则即可。后期随着业务的扩展,你的代码会不断的演化和重构,在此过程中设计模式绝逼会大放异彩的。说实话博主写完这篇文章感觉原型模式模式是不是有点多余啊,想复制原来创建的新的对象,使用拷贝构造函数不就可以了嘛,为什么还要弄一个新的设计模式出来呢。目前博主的理解就到这啦,有兴趣的可以后台TT博主一起交流呀!

weixin_62196764的博客 1105
上一篇: [设计模式]创建模式-单例(C++描述)
下一篇: [设计模式]创建模式-原型模型(C++描述)
second60
博客等级 码龄9年 155粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值