日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

深入浅出《设计模式》之工厂模式(C++)

發布時間:2023/12/2 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出《设计模式》之工厂模式(C++) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

模式介紹

在之前簡單工廠模式中,我們介紹了簡單工廠模式的缺陷是違背了開放-封閉原則。如果在面館中添加了烤海參,那將會修改waiter工廠類。違背了類內封閉原則。

還以面館為例,現在兩種面,用一個服務員來賣就可以,如果這個服務員不干了,后面賣面的廚師需要兼職頂替服務員,但是廚師又不能離開灶臺,就將模式改成了窗口排隊式,一隊海參炒面,另一隊辣根湯面。每個窗口分別有一個廚師放飯,一個會做海參炒面,另一個會做辣根湯面。老板覺得這種模式挺好,萬一來了一個會做烤海參的,就只需要開一個烤海參的窗口就好了,不需要重新要服務員學習,因為烤海參的就會賣。這就變成了工廠模式。

UML類圖

這里涉及到2種類①我,客戶端,排隊買飯。②做飯廚師類,工廠類,為我生成飯。③菜品類,生成菜品類。具體關系如下UML類圖:

代碼實例

下面是noodle類,是為工廠類使用的,繼承他就可以擴展noodle類別:

#ifndef NOODLE_H #define NOODLE_Hclass noodle { public:noodle() {}~noodle() {}virtual void eating() = 0; };#endif // NOODLE_H

下面是海參炒面類,繼承了noodle,實現eating方法,吃海參炒面:

#ifndef HAISHENNOODLE_H #define HAISHENNOODLE_H#include "noodle.h"class haishennoodle : public noodle { public:haishennoodle();~haishennoodle();virtual void eating(); };#endif // HAISHENNOODLE_H #include <iostream> #include "haishennoodle.h"haishennoodle::haishennoodle() {}haishennoodle::~haishennoodle() {}void haishennoodle::eating() {std::cout << "我是海參炒面,里面沒有海參哦!!吃的時候注意!" << std::endl; }

下面是辣根湯面,繼承了noodle,實現eating方法,吃辣根湯面:

#ifndef LAGENNOODLE_H #define LAGENNOODLE_H#include "noodle.h"class lagennoodle : public noodle { public:lagennoodle();~lagennoodle();virtual void eating(); };#endif // LAGENNOODLE_H #include <iostream> #include "lagennoodle.h"lagennoodle::lagennoodle() {}lagennoodle::~lagennoodle() {}void lagennoodle::eating() {std::cout << "我是辣根湯面,吃完嗆的哼啊!!!" << std::endl; }

下面是waiter工廠的基類。所有工廠都繼承這個類:

#ifndef WAITER_H #define WAITER_Hclass noodle; class waiter { public:waiter() {}~waiter() {}virtual noodle *createnoodle() = 0; };#endif // WAITER_H

下面是海參廚師(工廠1),海參廚師只管做海參炒面,重寫了createnoodle方法:

#ifndef HAISHEN_H #define HAISHEN_H#include "waiter.h"class noodle; class haishen : public waiter { public:haishen();~haishen();virtual noodle *createnoodle(); };#endif // HAISHEN_H #include <iostream> #include "haishen.h" #include "haishennoodle.h"haishen::haishen() {}haishen::~haishen() {}noodle *haishen::createnoodle() {std::cout << "面是我炒得,我的名字叫海參!!!" << std::endl;return new haishennoodle(); }

下面是辣根廚師(工廠1),辣根廚師只管做辣根湯面,重寫了createnoodle方法:

#ifndef LAGEN_H #define LAGEN_H#include "waiter.h"class lagen : public waiter { public:lagen();~lagen();virtual noodle *createnoodle(); };#endif // LAGEN_H #include <iostream> #include "lagen.h" #include "lagennoodle.h"lagen::lagen() {}lagen::~lagen() {}noodle *lagen::createnoodle() {std::cout << "吃辣根湯面,你不覺得嗆得哼嗎??" << std::endl;return new lagennoodle(); }

下面是客戶端,客戶端通過類別,使用相應的工廠類建立相應的實例:

#include <iostream> #include <string.h>#include "haishen.h" #include "lagen.h" #include "noodle.h"using namespace std;char *product_list[] = {"haishen-noodle","lagen-noodle",NULL };int main() {char *p = NULL;char *pd = "haishen-noodle";int i = 0;waiter *w = NULL;noodle *n = NULL;for(p = product_list[i]; p != NULL; i++, p = product_list[i]) {if(strncmp(pd, p, strlen(pd)) == 0) {if(i == 0) {w = new haishen();} else if(i == 1) {w = new lagen();} else {cout << "對不起,請您排在隊內!!!" << std::endl;break;}}}if(w) n = w->createnoodle();if(n) n->eating();if(w) {delete w; w = NULL;}if(n) {delete n; n = NULL;}return 0; }

下面是CMakeList.txt文件,幫助生成Makefile:

cmake_minimum_required(VERSION 2.8)project(noodle-factory) set(SRC_LIST main.cpp noodle.h waiter.h haishen.h haishen.cpp haishennoodle.h haishennoodle.cpplagennoodle.h lagennoodle.cpp lagen.h lagen.cpp) add_executable(${PROJECT_NAME} ${SRC_LIST})

編譯運行結果

代碼下載鏈接是:https://github.com/erguangqiang/freesir_headfirst/blob/master/noodle-factory.tar.gz
使用cmake生成Makefile,并編譯出可執行程序noodle。運行結果如下:

erguangqiang@elab$./noodle-factory 面是我炒得,我的名字叫海參!!! 我是海參炒面,里面沒有海參哦!!吃的時候注意!

結束

工廠模式解決了簡單工廠違背了的開放-封閉原則。雖然累的結構變的復雜了,但是對于擴展性得到了很大的提高。

轉載于:https://www.cnblogs.com/freeman2012/p/11206166.html

總結

以上是生活随笔為你收集整理的深入浅出《设计模式》之工厂模式(C++)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。