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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++设计模式之二 AbstractFactory模式

發布時間:2023/12/10 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++设计模式之二 AbstractFactory模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

設計模式的目的就是盡量減少“變化”對程序的影響,尤其是對客戶程序的影響。AbstractFactory模式作為創建型模式的一種,解決的就是“new”在變化中可能引起的問題。

先來看看new有何種不好,舉個創建汽車的車門的例子:
很自然的一種想法是:Door *door = new Door();
但是如果遇到創建老爺車的車門,創建現代車的車門,這段代碼就無所適從了。

OO為我們提供了哪些精華的思想?“封裝”,是的,將車門的創建封裝起來,于是我們有了靜態工廠方法:?
客戶程序代碼:

1Door*?door?=?doorFactory->CreateDoor();

庫程序代碼:

1class?DoorFactory
2{
3public:
4??Door*?CreateDoor()
5??{
6????return?new?Door();
7??}

8}

客戶程序在此是不會變化的,不管你是老爺車門,現代車門,還是鉆石車門,這些和客戶程序代碼都是沒關系的,究竟CreateDoor出來如何結果都交給多態來判斷,我們不用操心。
但是庫程序代碼還是需要更改的,但我們已經將“變化”與客戶程序隔離了。


需求又有變化了,不光要創建車門,還需要創建引擎,車燈,而且還是不同風格的。
這時候靜態工廠已經應付不來了,靜態工廠有其自身的缺陷“不能應對不同系列對象”的變化。

動機:
軟件系統中,經常面臨“一系列相互依賴的對象”的創建工作。(兩個特征:“一系列”,“相互依賴”)
將創建過程封裝起來,避免“客戶程序”和“多系列具體對象的創建工作”的緊耦合。

意圖:
提供一個接口,讓該接口負責創建一系列“相關或者相互依賴的對象”,無需指定他們具體的類。(GoF23)

思路:


對于客戶程序來說,只依賴于三個抽象的類:AbstractFactory,AbstractProductA,AbstractProductB。
以下是客戶程序代碼:

?1class?CarManager
?2{
?3protected:
?4????AbstractFactory?*abstractFactory;
?5public:
?6????//創造Car
?7????void?createCar(AbstractFactory?*abstractFactory)
?8????{
?9????????abstractFactory->CreateEngine();
10????????abstractFactory->CreateDoor();
11????????abstractFactory->CreateLight();
12????}

13????//其他的操作
14????void?run(){}
15}
;
16
17int?_tmain(int?argc,?_TCHAR*?argv[])
18{
19????CarManager?*carManager?=?new?CarManager();
20????//創建Classic風格的汽車
21????carManager->createCar(new?ClassicFactory());
22
23????return?0;
24}

所有關于創建的操作都是用抽象類完成的,對于具體是何種類型的對象由多態實現,以此來使“客戶代碼”和“多系列具體對象的創建工作”達到松耦合。

如果遇到還需要擴展其他風格的汽車,可以按下圖的思路

紅色的部分對應新風格的車輛,只需在庫程序中添加ConcreteFactory3,ProductA3,ProductB3三個類,而對于客戶代碼CarManager來說完全不受影響。

總結:
AbstractFactory模式有以下三個要點:
1.應對的問題是“多風格的系列對象創建”的變化問題,“系列對象”指的是這些對象之間有相互依賴或者相互作用的關系。否則使用“靜態工廠”足以。
2.抽象工廠和靜態工廠的核心是“封裝”,將對象的創建進行封裝,避免“new”引起的問題
3.抽象工程的另一個核心是“多態”,通過動態綁定來處理“不同風格”的問題

注:
AbstractFactory模式主要針對“風格”的變化,如果“對象”本身經常變化,那么該模式并不適用。


自己做的示例代碼,僅供參考

??1//
??2//?AbstractFactoryTest?for?AbstractFactory?Pattern?Test
??3//
??4//
??5
??6#include?"stdafx.h"
??7#include?"iostream"
??8using?namespace?std;
??9
?10//Engine,Door,Light?are?the?Abstract?Product
?11//這三個類對應UML圖中的AbstractProduct類
?12class?Engine
?13{
?14public:
?15????Engine()
?16????{
?17????????cout<<"Abstract?Engine?Create"<<endl;
?18????}

?19????virtual?void?doSomething()?=?0;
?20}
;
?21
?22class?Door
?23{
?24public:
?25????Door()
?26????{
?27????????cout<<"Abstract?Door?Create"<<endl;
?28????}

?29????virtual?void?doSomething()?=?0;
?30}
;
?31
?32class?Light
?33{
?34public:
?35????Light()
?36????{
?37????????cout<<"Abstract?Light?Create"<<endl;
?38????}

?39????virtual?void?doSomething()?=?0;
?40}
;
?41
?42//Abstract?Factory
?43class?AbstractFactory
?44{
?45public:
?46????AbstractFactory()
?47????{
?48????????cout<<"AbstractFactory?Create"<<endl;
?49????}

?50????virtual?Engine*?CreateEngine()?=?0;
?51????virtual?Door*?CreateDoor()?=?0;
?52????virtual?Light*?CreateLight()?=?0;
?53}
;
?54
?55//SpeedEngine,SpeedDoor,SpeedLight?are?the?Products?of?Speed?Style?
?56//這三個類對應UML圖中的ProductA1,ProductB1,ProductC1類
?57class?SpeedEngine:public?Engine
?58{
?59public?:
?60????SpeedEngine()
?61????{
?62????????cout<<"Speed?Engine?Create"<<endl;
?63????}

?64????void?doSomething(){????}
?65}
;
?66
?67class?SpeedDoor:public?Door
?68{
?69public?:
?70????SpeedDoor()
?71????{
?72????????cout<<"Speed?Door?Create"<<endl;
?73????}

?74????void?doSomething(){????}
?75}
;
?76
?77class?SpeedLight:public?Light
?78{
?79public?:
?80????SpeedLight()
?81????{
?82????????cout<<"Speed?Light?Create"<<endl;
?83????}

?84????void?doSomething(){????}
?85}
;
?86
?87//classicEngine,classicDoor,classicLight?are?the?products?of?Classic?style
?88//這三個類對應UML圖中的ProductA2,ProductB2,ProductC2類
?89class?ClassicEngine:public?Engine
?90{
?91public?:
?92????ClassicEngine()
?93????{
?94????????cout<<"Classic?Engine?Create"<<endl;
?95????}

?96????void?doSomething(){????}
?97}
;
?98
?99class?ClassicDoor:public?Door
100{
101public?:
102????ClassicDoor()
103????{
104????????cout<<"Classic?Door?Create"<<endl;
105????}

106????void?doSomething(){????}
107}
;
108
109class?ClassicLight:public?Light
110{
111public?:
112????ClassicLight()
113????{
114????????cout<<"Classic?Light?Create"<<endl;
115????}

116????void?doSomething(){????}
117}
;
118
119//Factory?for?Speed?Cars
120//對應UML圖中的ConcreteFactory1類
121class?SpeedFactory:public?AbstractFactory
122{
123public:
124????SpeedFactory()
125????{
126????????cout<<"SpeedFactory?Create"<<endl;
127????}

128????virtual?Engine*?CreateEngine()
129????{
130????????return?new?SpeedEngine();
131????}

132????virtual?Door*?CreateDoor()?
133????{
134????????return?new?SpeedDoor();
135????}

136????virtual?Light*?CreateLight()
137????{
138????????return?new?SpeedLight();
139????}

140}
;
141
142//Factory?for?classic?Cars
143//對應UML圖中的ConcreteFactory2類
144class?ClassicFactory:public?AbstractFactory
145{
146public:
147????ClassicFactory()
148????{
149????????cout<<"ClassicFactory?Create"<<endl;
150????}

151????virtual?Engine*?CreateEngine()
152????{
153????????return?new?ClassicEngine();
154????}

155????virtual?Door*?CreateDoor()?
156????{
157????????return?new?ClassicDoor();
158????}

159????virtual?Light*?CreateLight()
160????{
161????????return?new?ClassicLight();
162????}

163}
;
164
165//Client?Code?----?use?the?Abstract?Factory?&?Abstract?Product?to?create?the?car
166//this?is?never?changed
167class?CarManager
168{
169protected:
170????AbstractFactory?*abstractFactory;
171public:
172????//創造Car
173????void?createCar(AbstractFactory?*abstractFactory)
174????{
175????????abstractFactory->CreateEngine();
176????????abstractFactory->CreateDoor();
177????????abstractFactory->CreateLight();
178????}

179????//其他的操作
180????void?run(){}
181}
;
182
183int?_tmain(int?argc,?_TCHAR*?argv[])
184{
185????CarManager?*carManager?=?new?CarManager();
186????//創建Classic風格的汽車
187????carManager->createCar(new?ClassicFactory());
188
189????return?0;
190}

總結

以上是生活随笔為你收集整理的C++设计模式之二 AbstractFactory模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 日韩欧美区 | 天天干夜夜玩 | 久久男人| 原创露脸88av| 亚洲一区二区美女 | 99精品人妻无码专区在线视频区 | sesese99| 国产不卡视频 | 色哟哟一区二区三区 | 免费av网站观看 | 免费99精品国产自在在线 | 69网站在线观看 | 人人99 | 办公室摸腿吻胸激情视频 | 初尝黑人巨炮波多野结衣 | 日日夜夜狠狠操 | 99草视频 | 中文字幕 日韩 欧美 | 中文久草| chinese中国性按摩hd | 海角国产乱辈乱精品视频 | 黄色视屏在线播放 | 亚洲成年网站 | 裸体视频软件 | 人人干天天操 | 熊猫电影yy8y全部免费观看 | 色综合图区| 奇米影视在线视频 | 97干在线视频 | 一区二区三区日韩欧美 | 亚洲熟妇av一区二区三区漫画 | 中文字幕国产 | 天天射天天拍 | 国产精品一区二区无码免费看片 | 在线免费观看福利 | 日日舔夜夜操 | 会喷水的亲姐姐 | 亚洲成av人片久久 | 阿v视频在线免费观看 | a级性生活视频 | 亚洲日本久久久 | 91视频xxx | 好男人资源| 牛牛澡牛牛爽一区二区 | 亚洲国产成人一区二区精品区 | 放荡闺蜜高h苏桃情事h | 亚洲精品喷潮一区二区三区 | 性欧美巨大乳 | 人妻偷人精品一区二区三区 | 性做久久久久 | 88av在线播放 | 性色av一区二区三区四区 | 免费国产羞羞网站视频 | 亚洲毛片在线播放 | 美女国产免费 | 亚洲一级Av无码毛片久久精品 | 一个综合色 | 男人天堂五月天 | 欧美人体视频 | 黄色大片在线免费观看 | 日本天堂网在线观看 | 欧美精品成人 | 欧美日韩在线免费 | 日韩一级片免费在线观看 | 一级片自拍 | 亚洲乱码国产乱码精品 | av影院在线观看 | 日韩一区二区三区久久 | 欧美第一页草草影院 | 911毛片| 亚洲在线| 国产成人无码精品久久二区三 | 好吊日免费视频 | 奇米影视777四色 | 葵司免费一区二区三区四区五区 | 久久精品国产精品亚洲毛片 | 欧美精品在线视频观看 | 成人看片免费 | 色免费视频 | 国产成人欧美一区二区三区的 | 中文字幕亚洲激情 | 奇米影视播放器 | 人超碰 | 国产做爰全免费的视频软件 | 色偷偷影院 | 欧美性一区 | 久久伊人精品 | 四虎成人精品永久免费av | 精品亚洲在线 | 可以看黄色的网站 | 911看片 | 国产一区二区三区电影在线观看 | 欧洲视频一区二区三区 | 久草免费在线播放 | 在线超碰| 黄色一级网站 | 五月婷婷综合久久 | 91亚洲国产成人精品性色 | 欧美双性人妖o0 |