C++设计模式-生成器(Builder)

目录

C++设计模式-生成器(Builder)

一、意图

二、适用性

三、结构

四、参与者

五、代码


C++设计模式-生成器(Builder)

一、意图

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

二、适用性

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

三、结构

 

四、参与者

  • Builder

       为创建一个Product对象的各个部件指定抽象接口。

  • ConcreteBuilder

        实现Builder的接口以构造和装配该产品的各个部分。

        定义并明确它所创建的表示。

        提供一个检索产品的接口。

  • Director

        构造一个使用Builder接口的对象

  • Product

        表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。

        包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

五、代码

#include<iostream>
using namespace std;class Product {
public:void SetPartOne(string TempPartOne) {PartOne = TempPartOne;cout << "Set Part One: " << PartOne << endl;}void SetPartTwo(string TempPartTwo) {PartTwo = TempPartTwo;cout << "Set Part Two: " << PartTwo << endl;}void SetPartThree(string TempPartThree) {PartThree = TempPartThree;cout << "Set Part Three: " << PartThree << endl;}
private:string PartOne;string PartTwo;string PartThree;
};class Builder {
public:Product GetProduct() {return product;}virtual void BuildPartOne() = 0;virtual void BuildPartTwo() = 0;virtual void BuildPartThree() = 0;
protected:Product product;
};class ProductOneBuilder : public Builder {
public:void BuildPartOne() {product.SetPartOne("Product One's Part One");}void BuildPartTwo() {product.SetPartTwo("Product One's Part Two");}void BuildPartThree() {product.SetPartThree("Product One's Part Three");}
};class ProductTwoBuilder : public Builder {
public:void BuildPartOne() {product.SetPartOne("Product Two's Part One");}void BuildPartTwo() {product.SetPartTwo("Product Two's Part Two");}void BuildPartThree() {product.SetPartThree("Product Two's Part Three");}
};class Director {
public:Director() :builder(nullptr) {}void SetBuilder(Builder* TempBuilder) {this->builder = TempBuilder;}Product ConstructProduct() {builder->BuildPartOne();builder->BuildPartTwo();builder->BuildPartThree();return builder->GetProduct();}
private:Builder* builder;
};int main() {Builder* builder;Director* director = new Director;Product product;cout << "*** *** Construct Product One *** ***" << endl;builder = new ProductOneBuilder;director->SetBuilder(builder);product = director->ConstructProduct();delete builder;cout << "*** *** Construct Product Two *** ***" << endl;builder = new ProductTwoBuilder;director->SetBuilder(builder);product = director->ConstructProduct();delete builder;delete director;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/127649.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

N分频频率综合器MS72310可pin对pin兼容SKY72310

MS72310/MS72310N1 是一款小数 N 分频频率综合器。可pin对pin兼容SKY72310。它具有极高的频率分辨率、快的输出频率切换速度和低相位噪声性能。芯片需使用外部压控振荡器&#xff0c;最大工作频率 2.1GHz&#xff0c;适合应用于无线通信系统中。MS72310/MS72310N1 采用三线高速…

Astory 访谈|了解「非常律师禹英禑」背后的故事

请先简单做个自我介绍吧&#xff1f; 大家好&#xff0c;我是 Astory 的首席制作人 Younghwa Lee&#xff0c;负责监督《非常律师禹英禑》的制作。很高兴认识你。 是什么启发了你创造了《非常律师禹英禑》系列&#xff1f; 作为制片人&#xff0c;我非常感谢全球粉丝对《非常…

ToBeWritten之让响应团队参与并做好沟通

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

叠氮修饰的葡萄糖Ac4GIcNAz,98924-81-3

产品简介&#xff1a;The tetraacetylatedN-Azidoacetyl-glucosamine (Ac4GlcNAz) provides a non-radioactive alternativefor glycoconjugate visualization. It is cell-permeable, intracellularlyprocessed and incorporated instead of its natural monosaccharide count…

CRM系统如何自动分配线索

分配线索是销售部门很重要的一项工作&#xff0c;大量的线索中潜藏着许多企业未来的忠实客户。如果将大把的线索通过手工的方式分配给多个销售人员是一件棘手的事&#xff0c;就要借助CRM系统自动分配线索。 你的企业是否也面临这些难题&#xff1a; 1.渠道多线索多&#xff…

Shell 解释器,帮你解析一条Shell语句到底是什么意思

使用Linux系统的朋友&#xff0c;几乎每天都在使用Shell命令&#xff0c;比如 # 新建一个.sh脚本&#xff1a; vim 脚本名.sh # 运行一个.sh脚本&#xff1a; ./脚本名.sh ​​​​​​​Shell语句是一种用于与计算机操作系统交互的文本命令。Shell是计算机操作系统的命令行…

【刷题笔记10.5】LeetCode:排序链表

LeetCode&#xff1a;排序链表 一、题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 二、分析 这题咱们默认要求&#xff1a;空间复杂度为O(1)。所以这把咱们用自底向上的方法实现归并排序&#xff0c;则可以达到O(1) 的空间复杂…

mysql中的各种日志

错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&#xff0c;默认存放目录/var/log/,默认的日志文件名为my…

nssm nginx window 部署和开机启动服务

部署 去到Nginx官网&#xff1a;nginx news &#xff0c;然后点击“download” 在nginx的配置文件是conf目录下的nginx.conf nginx.exe http://localhost 在cmd命令窗口里面输入nginx命令(快速停止nginx) &#xff1a; nginx -s stop 或者使用(完整有序的停止nginx)命…

Mojo 正式发布,Rust 能否与之匹敌?

9 月 7 日&#xff0c;Modular 公司宣布正式发布 Mojo&#xff1a;Mojo 现在已经开放本地下载——初步登陆 Linux 系统&#xff0c;并将很快提供 Mac 与 Windows 版本。据介绍&#xff0c;Mojo 最初的目标是比 Python 快 35000 倍&#xff0c;近日该团队表示&#xff0c;Mojo 将…

中国34省区市三维地形图(直接保存)

吉林 ▼ 辽宁 ▼ 北京 ▼ 河北 ▼ 山东 ▼ 山西 ▼ 天津 ▼ 江苏 ▼ 福建 ▼ 上海 ▼ 台湾 ▼ 浙江 ▼ 广东 ▼ 广西 ▼ 海南 ▼ 香港和澳门 ▼ 安徽 ▼ 河南 ▼ 湖北 ▼ 湖南 ▼ 江西 ▼ 甘肃 ▼ 内蒙古 ▼ 宁夏 ▼ 青海 ▼ 陕西 ▼ 新疆 ▼ 贵州 …

分割等和子集

题目链接 分割等和子集 题目描述 注意点 数组 nums 非空数组 nums 只包含正整数 解答思路 最初想到的是根据回溯剪枝解决本题&#xff0c;如果数组大小小于2&#xff0c;则肯定不能找到分割等和子集&#xff0c;除此以外&#xff0c;如果数组之和sum不能被2整除&#xff0…