设计模式---5(建造者模式的概念及其实现,建造者模式的角色与职责,建造者模式和工厂模式的区别)

建造者模式

建造者模式的概念

  1. Builder 模式也叫建造者模式或者生成器模式,是由 GoF 提出的 23 种设计模式中的一种。 Builder 模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的 创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
  2. 对象的创建:Builder 模式是为对象的创建而设计的模式- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象- 关注对象创建的各部分的创建过程:不同的工厂 (这里指 builder 生成器)对产品属性有不同的创建方法

建造者模式的角色和职责

在这里插入图片描述

  1. 建造者(Builder):为创建产品各个部分,统一抽象接口。
  2. ConcreteBuilder:具体的创建产品的各个部分,部分 A, 部分 B,部分 C。
  3. 设计师(Director):构造一个使用 Builder 接口的对象。
  4. Product:表示被构造的复杂对象。

ConcreteBuilder 创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类, 包括将这些部件装配成最终产品的接口。

建造者模式的适用情况

一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。

建造者模式的实现

#include<iostream>
#include<string>using namespace std;//一个房子不管是公寓还是别墅,他都有三种属性,墙,地板,门
//建造公寓和别墅时,都需要建造者有房子的图纸//房子类
class House
{
public://创建地板void setFloor(string floor){this->m_floor = floor;}//创建墙void setWall(string wall){this->m_wall = wall;}//创建门void setdoor(string door ){this->m_door = door;}//获取地板string getFloor(){return m_floor;}//获取墙string getWall(){return m_wall;}//获取门string getDoor(){return m_door;}
private:string m_floor;//地板string m_wall;//墙string m_door;//门
};//建造者
class Builder
{
public:virtual void makeFloor() = 0; //建造者建地板virtual void makeWall() = 0;	//建造者建墙virtual void makeDoor() = 0; //建造者建门virtual House *GetHouse() = 0; //建造者建房子
};//建造者建造公寓 继承建造者类
class FlatBuild : public Builder
{
public:FlatBuild(){phouse = new House;//创建一个新的房子}virtual void makeFloor(){//这个房子的墙是公寓的地板phouse->setFloor("公寓的地板");}virtual void makeWall(){phouse->setWall("公寓的墙");}virtual void makeDoor(){phouse->setdoor("公寓的门");}virtual House *GetHouse(){return phouse;}
private:House *phouse; //维护一个房子类的指针
};//建造者建造别墅 
class VillBuild :public Builder
{
public:VillBuild(){pHouse = new House;}virtual void makeFloor(){pHouse->setFloor("别墅的地板");}virtual void makeWall(){pHouse->setWall("别墅的墙");}virtual void makeDoor(){pHouse->setdoor("别墅的门");}virtual House *GetHouse(){return pHouse;}
private:House *pHouse;
};//设计师类,用来指挥建造者
class Director
{
public:void Construct(Builder *builder){builder->makeFloor();builder->makeWall();builder->makeDoor();}
};int main(void)
{//客户自造房子,不花钱请建造者和设计师House *phouse = new House;phouse->setdoor("自己造的门");phouse->setFloor("自己造的地板");phouse->setWall("自己造的墙");cout << phouse->getDoor() << endl;cout << phouse->getWall() << endl;cout << phouse->getFloor() << endl;/*//建造者直接造公寓,不花钱请设计师Builder *builder = new FlatBuild;builder->makeFloor();builder->makeDoor();builder->makeWall();*///设计师指挥	建造者	建房子Director *director = new Director;//建公寓Builder *builder = new FlatBuild;director->Construct(builder);//设计师指挥建造者干活,直接全部建好House*house = builder->GetHouse();//获取已经建好房子的钥匙cout << house->getFloor() << endl;//查看建好房子的地板delete house;delete builder;//建别墅builder = new VillBuild;director->Construct(builder);//设计师 指挥工程队  建好别墅house = builder->GetHouse();//从建造者那块拿到别墅的钥匙cout << house->getFloor() << endl;//查看建好的别墅的地板delete house;delete builder;delete director;system("pause");return 0;
}

建造者模式和工厂模式的区别

Factory 模式中:
  1. 有一个抽象的工厂。
  2. 实现一个具体的工厂—汽车工厂。
  3. 工厂生产汽车 A,得到汽车产品 A。
  4. 工厂生产汽车 B,得到汽车产品 B。 这样做,实现了购买者和生产线的隔离。强调的是结果。
Builder 模式:
  1. 引擎工厂生产引擎产品,得到汽车部件 A。
  2. 轮胎工厂生产轮子产品,得到汽车部件 B。
  3. 底盘工厂生产车身产品,得到汽车部件 C。
  4. 将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
  5. 将这个整体送到汽车组装工厂,得到一个汽车产品。
总结

这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程 两者的区别在于:

  1. Factory 模式不考虑对象的组装过程,而直接生成一个我想要的对象。
  2. Builder 模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
  3. Factory 模式所解决的问题是,工厂生产产品。
  4. 而 Builder 模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品 生成器中得到产品。

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

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

相关文章

system阻塞SIGCHLD信号原因

system阻塞SIGCHLD信号原因 标签&#xff1a; c 2014-11-08 11:58 198人阅读 评论(0) 收藏 举报 分类&#xff1a; linux编程&#xff08;1&#xff09; 代码1&#xff1a;APUE10.18节的system函数源代码 int system(const char *cmdstring) /* with appropriate signal ha…

设计模式6---(单例模式的概念及其实现(懒汉式和饿汉式),线程安全)

单例模式 单例模式的概念 单例模式是一种对象创建型模式&#xff0c;使用单例模式&#xff0c;可以保证为一个类只生成唯一的实例对象。也就是说&#xff0c;在整个程序空间中&#xff0c;该类只存在一个实例对象。 GoF 对单例模式的定义是&#xff1a;保证一个类、只有一个实…

套接字编程---2(TCP套接字编程的流程,TCP套接字编程中的接口函数,TCP套接字的实现,TCP套接字出现的问题,TCP套接字多进程版本,TCP套接字多线程版本)

TCP模型创建流程图 TCP套接字编程中的接口 socket 函数 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 这是大多数用来产生socket的协议&#xff0c;使用TCP或UDP来传输&…

Linux中netstat工具详解

简介 Netstat 命令用于显示各种网络相关信息&#xff0c;如网络连接&#xff0c;路由表&#xff0c;接口状态 (Interface Statistics)&#xff0c;masquerade 连接&#xff0c;多播成员 (Multicast Memberships) 等等。 常见参数 -a (all)显示所有选项&#xff0c;默认不显示…

网络基础 2-1(应用层,HTTP三点注意,HTTP协议格式, 最简单的HTTP服务器)

应用层 应用层 负责应用程序之间的数据沟通-----协议都是用户自己定的 自定制协议&#xff1a; 结构化数据传输 序列化&#xff1a; 将数据对象以指定的协议&#xff08;数据格式&#xff09;进行可用于持久化存储或者数据传输时的数据组织 例如在分布式的系统中&#xf…

网络基础2-2(传输层,端口,详谈UDP)

传输层 负责数据能够从发送端传输接收端. 端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序;在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n查看);一个端口只能被一个…

网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

TCP协议 TCP协议概念 TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议格式 1. 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去; 2. 32位序号/32位确认号: 后面详细讲; 3. 4位TCP报头长度: 表示该…

字符串题目 1 --------判断两个字符串是否为旋转词

题目描述 如果一个字符串为str&#xff0c;把字符串的前面任意部分挪到后面形成的字符串交str的旋转词。比如str“12345”&#xff0c;str的旋转串有“12345”、“45123”等等。给定两个字符串&#xff0c;判断是否为旋转词。 输入描述: 输出包含三行&#xff0c;第一个两个…

字符串题目---2判断两个字符串是否为变形词

题目描述 给定两个字符串str1和str2&#xff0c;如果str1和str2中出现的字符种类出现的一样且每种字符出现的次数也一样&#xff0c;那么str1和str2互为变形词。请判断str1和str2是否为变形词 输入描述: 输入包括3行&#xff0c;第一行包含两个整数n&#xff0c;m(1 \leq n,…

设计模式7----代理模式

代理模式 概念 Proxy 模式又叫做代理模式&#xff0c;是结构型的设计模式之一&#xff0c;它可以为其他对象提供一 种代理&#xff08;Proxy&#xff09;以控制对这个对象的访问。 所谓代理&#xff0c;是指具有与代理元&#xff08;被代理的对象&#xff09;具有相同的接口的…

网络基础3-1(细谈IP协议头, 网络层,子网划分,路由选择,数据链路层,以太网帧格式,MAC地址,再谈ARP协议)

IP协议 IP协议头格式 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是44位头部长度(header length): IP头部的长度是多少个。32bit, 也就是 length * 4 的字节数. 4bit表示大 的数字是15, 因此IP头部大长度是60字节8位服务类型(Type Of Service): 3位优先权字段(已…

网络中典型协议--(DNS,输入url后, 发生的事情. ,ICMP,NAT)

DNS&#xff08;Domain Name System&#xff09; DNS是一整套从域名映射到IP的系统 域名服务器发展背景 TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆. 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机…

高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)

高级IO&#xff1a; 五种典型IO&#xff1a; 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接 IO多路转接模型&#xff1a;select/poll/epoll 五种典型IO 阻塞IO IO操作的流程&#xff1a;等待IO操作条件具备&#xff0c;然后进行数据拷贝 为了完成IO操作发起调用&#xff…

IO多路转接模型----(select的模型,select的优缺点,poll的模型,poll的优缺点)

IO多路转接模型&#xff1a;select/poll/epoll 对大量描述符进行事件监控(可读/可写/异常) select模型 用户定义描述符的事件监控集合 fd_set&#xff08;这是一个位图&#xff0c;用于存储要监控的描述符&#xff09;; 用户将需要监控的描述符添加到集合中&#xff0c;这个描…

IO多路转接模型-----epoll

epoll&#xff1a; Linux下性能最高的多路转接模型 epoll 有3个相关的系统调用. epoll_create 功能&#xff1a;创建epoll&#xff0c;在内核中创建eventpoll结构体&#xff0c;size决定了epoll最多监控多少个描述符&#xff0c;在Linux2.6.8之后被忽略&#xff0c;但是必须…

再写单链表(不带头单链表)

单链表 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 单向、双向带头、不带头循环、非循环 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常用还是两种结构&#xff1a; 无头单向非循环链表&#xff1a;结构简单&#xff0…

再写双向循环链表

#pragma once #include<assert.h> #include<malloc.h> #include<stdio.h> typedef int DLDataType;//定义链表结点结构 typedef struct DListNode{DLDataType value;struct DListNode *prev; //指向前一个结点struct DListNode *next; //指向后一个结点 } DL…

链表题目--1 删除链表中所有等于val的值

注意事项 要删除的结点相邻第一个结点就是要删除的结点 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val){if(headNULL){return NULL;}struct …

链表题目--2 求链表的中间结点 和 求链表中倒数第k个结点

求链表的中间结点 思路 一个走两步&#xff0c;一个走一步。一个走到尾&#xff0c;另外一个就走到了中间 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head…

链表题目---3 合并两个有序单链表 和 分割链表

合并两个有序单链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){if(l1 NULL){return l2;}else if(l2 NULL){return l1;}struc…