Builder(生成器模式) 创建型
生成器模式
- 一、概述
- 二、结构
- 三、适用场景
- 四、优缺点
- 五、实例
一、概述
生成器是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建 代码生成不同类型和形式的对象。
二、结构
生成器(Builder)接口声明在所有类型生成器中通用的产品构造步骤。
具体生成器(Concrete Builders)提供构造过程的不同实现。具体生成器也可以构造不遵循通用接口的产品。
产品(Products)是最终生成的对象。由不同生成器构造的产品无需属于同一类层次结构或接口。
主管(Director)类定义调用构造步骤的顺序,这样你就可以创建和复用特定的产品配置。
客户端(Client)必须将某个生成器对象与主管类关联。一般情况下,你只需通过主管类构造函数的参数进行一次性关联即可。此后主管类就能使用生成器对象完成后续所有的构造任务。但在客户端将生成器对象传递给主管类制造方法时还有另一种方式。在这种情况下,你在使用主管类生产产品时每次都可以使用不同的生成器。
三、适用场景
当构造过程必须允许被构造的对象有不同的表示时。
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
使用代码创建不同形式的产品。
四、优缺点
优点:
可以分步创建对象,暂缓创建步骤或递归运行创建步骤。
扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
单一职责原则。你可以将复杂构造代码从产品的业务逻辑中分离出来。
封装性好,构建和表示分离。
缺点:
由于该模式需要新增多个类,因此代码整体复杂程度会有所增加。
产品的组成部分必须相同,这限制了其使用范围。
五、实例
#include<iostream>
#include<string>
#include<memory>
using namespace std;// 产品类 车
class Car {private:string tire_;//轮胎string steering_whel_;//方向盘string engine_;//发动机
public:Car() {}void set_car_tire(string t) {tire_ = t;cout << "set tire:" << tire_ << endl;}void set_car_steering_wheel(string sw){steering_whel_ = sw;cout << "set steering wheel:" << steering_whel_ << endl;}void set_car_engine(string e){engine_ = e;cout << "set engie:" << engine_ << endl;}
};// 抽象建造者
class CarBuilder {protected:Car car_;
public:Car getCar() {return car_;}// 抽象方法virtual void buildTire() = 0;virtual void buildSteeringWheel() = 0;virtual void buildEngine() = 0;
};// 具体建造者 奔驰
class BenzBuilder :public CarBuilder
{public:// 具体实现方法void buildTire() override {car_.set_car_tire("benz_tire");}void buildSteeringWheel() override {car_.set_car_steering_wheel("benz_steering_wheel");}void buildEngine() override {car_.set_car_engine("benz_engine");}
};// 具体建造者 奥迪
class AudiBuilder : public CarBuilder {public:// 具体实现方法void buildTire() override {car_.set_car_tire("audi_tire");}void buildSteeringWheel() override {car_.set_car_steering_wheel("audi_steering_wheel");}void buildEngine() override {car_.set_car_engine("audi_engine");}
};// 指挥者
class Director {private:CarBuilder* builder_;public:Director() : builder_(nullptr) {}void set_builder(CarBuilder* cb) {builder_ = cb;}// 组装汽车Car ConstructCar() {builder_->buildTire();builder_->buildSteeringWheel();builder_->buildEngine();return builder_->getCar();}};int main()
{//抽象建造者(一般是动态确定的)CarBuilder* builder;// 指挥者Director * director = new Director();// 产品Car car;// 建造奔驰cout << "construct benz car" << endl;builder = new BenzBuilder();director->set_builder(builder);car = director->ConstructCar();delete builder;// 建造奥迪cout << "construct audi car" << endl;builder = new AudiBuilder;director->set_builder(builder);car = director->ConstructCar();delete builder;cout << "done" << endl;delete director;return 0;
}
Builder(生成器模式) 创建型相关推荐
- 建造者模式 生成器模式 创建型 设计模式(五)
建造者模式 Builder 也叫做生成器模式 在正式开始建造者模式之前,先回顾下抽象工厂模式 本人的所有系列文章都是自己学习的记录过程,均有比较严格的先后顺序,如果不清楚抽象工厂模式可以先往前翻翻 从 ...
- Builder生成器模式
这次来学习另一个创建型设计模式:Builder生成器模式. GOF对Builder模式的定义 (1)意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. (2)适用性 1. ...
- 设计模式--Builder生成器模式
GOF<设计模式>中说道:将一个复杂对象的构建与其表示向分离,使得同样的构建过程可以创建不同的表示. 所谓"复杂对象",是指:此对象中还含有其它的子对象. ...
- [设计模式] —— Builder 生成器模式
文章目录 Builder 生成器模式 动机 定义 示例代码 结构图 总结 Builder 生成器模式 动机 面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构 ...
- Prototype原型模式(创建型模式)
1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...
- 建造者模式与原型模式/builder模式与prototype模式/创建型模式
建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...
- C#设计模式系列 8 ----Builder 生成器模式之--发工资了,带老婆到 岗顶百脑汇配置电脑...
1.理论定义 生成器模式 又叫:建造者模式,它 可以 把一个 复杂的对象,分步骤创建. 2.应用举例 需求描述:话说发工资了,打算去岗顶百脑汇 给老婆配置一台电脑. OK,坐着BRT,就出发了. ...
- C++设计模式之工厂模式(创建型模式)
学习软件设计,向OO高手迈进! 设计模式(Design pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案. 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来 ...
- 深入浅出设计模式 ------ Builder(生成器模式)
一. 定义 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 二. 结构 三. 参与者 Builder : 为创建一个Product对象的各个部件指定抽象接口. Con ...
最新文章
- Scala变量和常量
- 鳗鱼劈断后下半身还能运动,机器人:拿来吧你丨Science子刊封面
- 基于FPGA的LED点阵系统开发
- source insight 4.0 括号尾部提醒 及 常用快捷键
- Go 导入当前项目下的包
- android EditText inputType
- .NET Core3发布Json API
- NOI2011 智能车比赛
- FFM原理及公式推导
- 71. 尽早刷新文档的输出
- 微信/抖音商城小程序源码开源版(下载)
- Markdown 数学公式
- office 论文 页码_原创:如何设置毕业论文的页眉和页码(word2007和word2010)
- VM虚拟机双网卡配置
- Android-NFC模块学习(1)
- 现在做网站到底需要多少钱?
- 额定功率台式计算机,解决方案:计算机电源分类当前的台式计算机电源的额定功率为200-4...
- 爬取豆瓣网前一百名电影
- 面试题:有7克、2克砝码各一个,天平一只,如何只用这些物品称三次,将140克的盐分成50、90克各一份?...
- android 地图显示物流,离线地图
热门文章
- qt实现在电脑端群发微信
- 博后招募 | 新加坡科技与设计大学段凌杰教授招收人工智能方向博士后
- 卷积码编码及维特比译码(Viterbi)算法的原理及其FPGA实现
- zabbix4.0学习五:Zabbix监控邮箱发送设置
- 双非末流一本面霸,十面阿里,七面头条,4个月斩获六个Offer!
- python的try和except用法_Python中的错误和异常处理简单操作示例【try-except用法】...
- IDIC再升级曙光展示企业级硬实力
- dBm和mW互相转换公式(以及常用功率对照表)
- 利用VC实现图像的特殊显示效果
- 推荐一个高仿微信的项目 有点屌!!