C++实现设计模式——Builder模式

  • 建造者模式定义

建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

  • 举例为什么用Builder模式

举一个通俗的例子:

我们大家都玩游戏吧,每个角色会有很多属性,即构造参数,有一些是构造必需参数,如id,name,有一些是可以用默认的值,比如hp,level等等,游戏刚开始我们可以用默认值构造,但是当游戏过了一段时间这些属性都变得各不一样了,此时我们再次构造玩家角色的时候,只能是先构造一个初始化的,然后在后期修改赋值,如下:

Player *p1 = new Player ();
p1->setName("milo");
p1->setHp(1000);
p1->setleve(6);
```

但是这样有个不好的地方,那就是对象的构造过程是非连续的,也就是说对象可处于一个构造不完全的状态,我们很容易写出将对象传入各个方法,每个方法去赋值对象的某一部分这样的代码,这其实引入了一个状态空间,如果状态空间是强可控的,那还好(但依然提高了维护成本,你需要牢牢掌握住对象的构造过程,什么字段在何处被赋值);如果不可控,那么就很难保证这个对象是否被正确的构造,可能在某个方法中覆盖了某字段,也可能遗漏了某字段导致 错误。

那为了解决这个问题,建造者模式就出现了,就可以写成下面的这种方式

Player p1= PlayerBuilder.player().name("milo").hp(1000).leve(6).build();

需要构造什么参数,就加上哪个接口,其它的用默认值,这就可以绝对赋值哪个,这是第一个优点,还有一个优点,建造者模式可以随机组装构造参数的顺序,个数,这个在复杂构造的情况下很有用。

  • 结构图

  • 代码举例
#include <iostream>
#include <string>
using namespace std; class Player;class playBuilder
{public:string Name;int ID;int HP;int Level;public:playBuilder() {    //参数默认值Name = "xiaoming";ID = 1001;HP = 100;Level = 1;cout<<"默认构造函数"<<endl;}playBuilder* SetName(string Name) {this->Name = Name;return this;}playBuilder* SetID(int ID) {this->ID = ID;return this;}playBuilder* SetHP(int HP) {this->HP = HP;return this;}playBuilder* SetLevel(int Level) {this->Level = Level;return this;}Player *build();
};class Player {public:                 string Name;int ID;int HP;int Level;public:string GetName() {return Name;}int GetID() {return ID;}int GetHP() {return HP;}int GetLevel() {return Level;}Player() {cout<<"默认构造函数"<<endl;}Player (playBuilder const &temp) {this->Name = temp.Name;this->ID = temp.ID;this->HP = temp.HP;this->Level = temp.Level;}~Player() {}void show() {cout<<Name<<"-"<<ID<<"-"<<HP<<"-"<<Level<<endl;}
};Player *playBuilder::build(){return new Player(*this);
}int main() {Player * p1 = playBuilder().SetID(90)->build();Player * p2 = playBuilder().SetID(91)->SetHP(200)->build();Player * p3 = playBuilder().SetName("zhangsan")->SetID(92)->build();p1->show();p2->show();p3->show();return 0;
}

上面这种情况就是我们要设置哪个参数就添加哪个方法set就行,对象是一个完整的创建过程,这也是我们很多地方比较常见的一种用法,它比正常的builder少了director角色,算是个简化版。

加入现在我们要求按照一定的规则进行构造,下面我们加上director,如果说builder是构造器,可以给我们随心构造的条件,那么director就好比一个指挥者,它规定着builder该怎么去创建一个目标对象。

#include <iostream>
#include <string>
using namespace std; class Player;class playBuilder
{public:string Name;int ID;int HP;int Level;public:playBuilder() {    //参数默认值Name = "xiaoming";ID = 1001;HP = 100;Level = 1;cout<<"默认构造函数"<<endl;}playBuilder* SetName(string Name) {this->Name = Name;return this;}playBuilder* SetID(int ID) {this->ID = ID;return this;}playBuilder* SetHP(int HP) {this->HP = HP;return this;}playBuilder* SetLevel(int Level) {this->Level = Level;return this;}Player *build();
};class Player {public:                 string Name;int ID;int HP;int Level;public:string GetName() {return Name;}int GetID() {return ID;}int GetHP() {return HP;}int GetLevel() {return Level;}Player() {cout<<"默认构造函数"<<endl;}Player (playBuilder const &temp) {this->Name = temp.Name;this->ID = temp.ID;this->HP = temp.HP;this->Level = temp.Level;}~Player() {}void show() {cout<<Name<<"-"<<ID<<"-"<<HP<<"-"<<Level<<endl;}
};Player *playBuilder::build(){return new Player(*this);
}class Director {public:playBuilder *builder;Director() {builder = new playBuilder();}Player * construct(string Name,int ID,int HP,int Level) {   //构造规则builder = builder->SetName(Name);builder = builder->SetID(ID);builder = builder->SetHP(HP);builder = builder->SetLevel(Level);return builder->build();}~ Director() {delete builder;}
};int main() {Director d1;Player * p1 = d1.construct("xiaowang",999,9999,1);   //输入构建规则需要的参数Player * p2 = Director().construct("xiaosong",888,8888,8);Player * p3 = playBuilder().SetName("zhangsan")->SetID(92)->build();p1->show();p2->show();p3->show();return 0;
}

如图中所示,参数的构造顺序和需要构造哪些参数都在Director中决定了,如果需要多种规则方案,就往里面添加construct方法。

以上就是builder的设计方式相关了,只是简单的介绍了为什么要用,可以怎么用,具体的线程安全等等细节,在我们实际使用的时候还是要多考虑考虑的。

C++实现设计模式——Builder模式相关推荐

  1. 设计模式-Builder模式

    目录 一个例子(做汤) 人工做汤 机器做汤(使用Builder模式) 优缺点 优点 缺点 Builder模式属于创建型模式. 它是将一个复杂对象的构建过程隐藏起来,让使用者只关系自己要生成什么样的对象 ...

  2. 设计模式--builder 模式

    设计模式–builder 模式 说明 @author JellyfishMIX - github / blog.jellyfishmix.com LICENSE GPL-2.0 本文默认已经知道了 b ...

  3. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  4. 设计模式 —— Builder 模式

    文章目录 1 Builder 模式的核心思想 2 第一种 Builder 模式 3 第一种模式的困惑 4 第二种 Builder 模式 5 第二种 Builder 模式见解 6 参考 1 Builde ...

  5. Java 常用设计模式 -- Builder模式

    Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...

  6. java的设计模式 - Builder模式

    Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...

  7. GOF 设计模式 builder模式笔记

    Builder(生成器) 意图:将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示. 在以下情况使用Builder模式 当创建复杂的对象应该独立于该对象的组成部分以及它们的装配 ...

  8. Java设计模式-Builder模式

    Builder模式是将一个复杂对象的创建和表示分离,使同样的创建过程可以创建不同的表示.它属于建造类模式. 一般来说,如果一个对象的创建比较复杂,超出了构造方法所能包含的范围,就可以使用工厂模式和Bu ...

  9. 设计模式 builder模式

    也是属于对象创建类模式.使用的一般情况是,需要完成一个复杂的对象创建工作,工作通常由各个部分的子对象用一定的算法构成,比如step1,step2,step3,步骤内部常常发生剧烈的变化,但是组合在一起 ...

  10. 设计模式-Builder模式(构建者模式)

    目录 构建者模式是什么? 为什么要用构建者模式? 构建者模式是什么? 简单来说,就是用于组装具有复杂结构的实例的模式. 什么意思呢?先来看个例子,比如现在有一个类TextBuilder用来创建一个文本 ...

最新文章

  1. ​双十一剁手后,听蒋涛谈谈AI人才多么吸金:2018年社招AI人才平均月薪竟高达4万,算法红利期还有2年
  2. “作为字节跳动面试官,有些话我不得不说!”
  3. 工作一周了,紧张 + 累
  4. cordova编译报错:Execution failed for task ':processDebugResources'
  5. 【Java 并发编程】线程池机制 ( 线程池状态分析 | 线程池状态转换 | RUNNING | SHUTDOWN | STOP | TIDYING | TERMINATED )
  6. 面试官问你JavaScript,直接把这篇文章甩给他
  7. [VB.NET]请教一个如何对姓名进行同音字查询?
  8. 游戏必备组件有哪些_抖音直播互动游戏有哪些?直播间热场互动必备的5个小游戏...
  9. 【Download error:TOO MANY REQUESTS】【TypeError:excepted string or buffer】
  10. STM32F1XX的GPIO的8种工作模式以及GPIO的寄存器简介
  11. 物理系统之碰撞检测——碰撞器
  12. mysql数据库中count的作用_MySQL数据库中的count的用法
  13. 解决windows图标和程序真正图标不一致的问题。
  14. R语言与多元线性回归+逐步回归
  15. 【转】Clique共识算法
  16. Datax自定义Transformer数据清洗(使用本地加载local_storage解耦合)
  17. babel 学习笔记
  18. SqlSugar 1.基础查询
  19. 代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素
  20. 收藏!纯净windows系统镜像下载网站

热门文章

  1. 智慧园区中心服务平台建议方案
  2. linux64位wps下载授权码,ubuntu15.04安装wps-office的64位版
  3. 第三单元JML地铁系统博客 By Wazaki
  4. 人工智能、机器学习、深度学习、神经网络的区别
  5. 异步FIFO设计与实现及相关问题
  6. JEB配合IDA神器逆向
  7. IntelliJ IDEA 使用教程(2019图文版)
  8. 修改文件 火车票买下铺_火车票怎么买到下铺
  9. EDIUS 9 PRO(视频编辑软件)
  10. maxwell理论知识