設計模式---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.pswp.cn/news/383205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383205.shtml
英文地址,請注明出處:http://en.pswp.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;保證一個類、只有一個實…

C語言解析http請求表單內容

[1].[文件] cgi.h ~ 405B 下載(105) 跳至 [1] [2] [3] [4] [5] [6] [7] [8] ?123456789101112131415161718192021222324252627#ifndef CGI_H#define CGI_H#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct Node{char *…

centos給用戶添加sudo權限

linux給用戶添加sudo權限&#xff1a; 有時候&#xff0c;linux下面運行sudo命令&#xff0c;會提示類似&#xff1a; xxxis not in the sudoers file. This incident will be reported. 這里&#xff0c;xxx是用戶名稱&#xff0c;然后導致無法執行sudo命令&#xff0c;這時候…

php手冊

http://www.php100.com/manual/php/ http://www.kuqin.com/php5_doc/

套接字編程---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來傳輸&…

安全關注

http://yttitan.blog.51cto.com/70821/1576365

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…

正則表達式 學習

http://regexr.com/ 在線匹配 http://c.biancheng.net/cpp/html/1434.html 查詢網址

網絡基礎2-2(傳輸層,端口,詳談UDP)

傳輸層 負責數據能夠從發送端傳輸接收端. 端口號 端口號(Port)標識了一個主機上進行通信的不同的應用程序;在TCP/IP協議中, 用 “源IP”, “源端口號”, “目的IP”, “目的端口號”, “協議號” 這樣一個五元組來標識一個通信(可以通過 netstat -n查看);一個端口只能被一個…

中文rfc文檔路徑

http://man.chinaunix.net/develop/rfc/default.htm

網絡基礎2-3(TCP協議,三次握手,四次揮手,TIME_WAIT狀態的作用,TCP如何保證可靠傳輸,TCP連接中狀態轉化,滑動窗口,流量控制,快速重傳,擁塞窗口,延遲應答,捎帶應答,粘包問題)

TCP協議 TCP協議概念 TCP全稱為 “傳輸控制協議(Transmission Control Protocol”). 人如其名, 要對數據的傳輸進行一個詳細的控制 TCP協議格式 1. 源/目的端口號: 表示數據是從哪個進程來, 到哪個進程去; 2. 32位序號/32位確認號: 后面詳細講; 3. 4位TCP報頭長度: 表示該…

超時設置

//read操作加上超時時間。1 int read_timeout(int fd, void *buf, uint32_t count, int time)2 {3 if(time > 0) {4 fd_set rSet;5 FD_ZERO(&rSet);6 FD_SET(fd, &rSet);7 8 struct timeval timeout;9 memset(&tim…

字符串題目 1 --------判斷兩個字符串是否為旋轉詞

題目描述 如果一個字符串為str&#xff0c;把字符串的前面任意部分挪到后面形成的字符串交str的旋轉詞。比如str“12345”&#xff0c;str的旋轉串有“12345”、“45123”等等。給定兩個字符串&#xff0c;判斷是否為旋轉詞。 輸入描述: 輸出包含三行&#xff0c;第一個兩個…

2021-03-04

為什么nginx轉發后端默認使用1.0而不是1.1 在 Nginx 的官網文檔中&#xff0c;有這樣一個指令&#xff1a; Syntax: gzip_http_version 1.0 | 1.1; Default: gzip_http_version 1.1; Context: http, server, location Sets the minimum HTTP version of a request required to…

字符串題目---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位優先權字段(已…

c++常見并且必須記住的問題

一、基礎知識 基本語言 1、說一下static關鍵字的作用 ?2、說一下C和C的區別 3、說一說c中四種cast轉換 4、請說一下C/C 中指針和引用的區別&#xff1f; 5、給定三角形ABC和一點P(x,y,z)&#xff0c;判斷點P是否在ABC內&#xff0c;給出思路并手寫代碼 6、怎么判斷一個…