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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

设计模式:工厂方法模式(C++)【简单工厂进行升级】

發(fā)布時(shí)間:2025/3/15 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式:工厂方法模式(C++)【简单工厂进行升级】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

工廠方法模式介紹

我們接上一集設(shè)計(jì)模式:簡(jiǎn)單工廠模式(C++),在簡(jiǎn)單工廠模式中,知道它的優(yōu)點(diǎn)可以將我們從自己生產(chǎn)產(chǎn)品中解放出來(lái),它的缺點(diǎn):

1、 必須提供一個(gè)產(chǎn)品類型 給工廠 然后工廠給我們生產(chǎn)產(chǎn)品這就意味著客戶必須知道工廠能夠提供哪些產(chǎn)品 ,才能向工廠要相應(yīng)的產(chǎn)品!

2、每次添加新的產(chǎn)品類型,我們都要去更改簡(jiǎn)單工廠的代碼,這樣代碼就很耦合了,不利于維護(hù)。

那么有沒(méi)有一種更好的方法,既能保存原來(lái)的優(yōu)點(diǎn),又可以將生產(chǎn)產(chǎn)品的工廠解耦呢?還可以讓用戶不用記住工廠生產(chǎn)的產(chǎn)品呢?

ok,那么我們工廠方法模式 就閃亮登場(chǎng)了。工廠方法模式就是來(lái)解決簡(jiǎn)單工廠模式的缺點(diǎn)而來(lái)的。我們先不談工廠方法模式,我們自己考慮代碼解耦合 最好的辦法是不是進(jìn)行抽象化呢?既然簡(jiǎn)單工廠模式的生成產(chǎn)品的方法 耦合了,那我們對(duì)它進(jìn)行抽象化不就得了。這就是一個(gè)思考的方向。工廠方法模式 就是在簡(jiǎn)單工廠模式的基礎(chǔ)上將生成產(chǎn)品的工廠方法進(jìn)行抽象化!抽象化之后,不同的工廠生產(chǎn)不同的產(chǎn)品,各司其職。用戶需要什么樣的產(chǎn)品 就去找對(duì)應(yīng)的 的工廠就行了

工廠方法模式模型圖


工廠方法模式代碼

#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //汽車基類 抽象類不可以實(shí)例化 class Car { public:Car(string name){this->name = name;}virtual void run() = 0;//純虛函數(shù)void setName(string name){this->name = name;}string getName(){return this->name;} private:string name; }; //寶馬汽車?yán)^承汽車類 class BMW :public Car { public:BMW(string name) :Car(name){}void run(){cout << this->getName() << "已經(jīng)啟動(dòng)。" << "寶馬汽車歡迎您。" << endl;} }; //奔馳汽車?yán)^承汽車類 class Benz :public Car { public:Benz(string name) :Car(name){}void run(){cout << this->getName() << "已經(jīng)啟動(dòng)。" << "奔馳汽車歡迎您。" << endl;} }; //哈弗汽車?yán)^承汽車類 class Haval :public Car { public:Haval(string name) :Car(name){}void run(){cout << this->getName() << "已經(jīng)啟動(dòng)。" << "哈弗汽車歡迎您。" << endl;} }; /* 工廠方法模式實(shí)際上就是將原來(lái)的簡(jiǎn)單工廠模式的 生成產(chǎn)品的方法進(jìn)行抽象化 */ //生成汽車的抽象工廠 class AbstractCarFactory { public:virtual Car* CreateCar() = 0;//純虛函數(shù) }; //生產(chǎn)寶馬汽車的 工廠 class BMWCarFactory:public AbstractCarFactory { public :Car* CreateCar(){Car* bmw = new BMW("寶馬");return bmw;} }; //生產(chǎn)奔馳汽車的 工廠 class BenzCarFactory :public AbstractCarFactory { public:Car* CreateCar(){Car* benz = new Benz("奔馳");return benz;} }; //生成哈弗汽車的 工廠 class HavalCarFactory :public AbstractCarFactory { public:virtual Car* CreateCar(){Car* haval = new Haval("哈弗");return haval;} }; int main(int argc, char *argv[]) {AbstractCarFactory *bmwFactory = new BMWCarFactory();//寶馬工廠 專門生產(chǎn)寶馬AbstractCarFactory *benzFactory = new BenzCarFactory();//奔馳工廠 專門生產(chǎn)奔馳AbstractCarFactory *havalFactory = new HavalCarFactory();//哈弗工廠 專門生產(chǎn)哈弗//無(wú)須記住產(chǎn)品名稱 只需對(duì)應(yīng)的工廠 就可以直接生成出對(duì)應(yīng)的 汽車了Car* bmw = bmwFactory->CreateCar();Car* benz = benzFactory->CreateCar();Car* haval = havalFactory->CreateCar();//啟動(dòng) 汽車bmw->run();benz->run();haval->run();return EXIT_SUCCESS; }

運(yùn)行結(jié)果

工廠方法模式的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 不需要記住具體類名(產(chǎn)品名),只需找相應(yīng)的工廠
  • 實(shí)現(xiàn)了對(duì)象的創(chuàng)建和使用的分類(工廠嘛,生成產(chǎn)品不再需要你親力親為了)。
  • 可擴(kuò)展變好了,加入新的產(chǎn)品 無(wú)須更改原接口和原類
  • 缺點(diǎn)

  • 當(dāng)然增加了系統(tǒng)中類的個(gè)數(shù),復(fù)制度有所增加
  • 增加了抽象性和理解難度(相信對(duì)于你來(lái)說(shuō)是沒(méi)有難度的)


  • 總結(jié)

    以上是生活随笔為你收集整理的设计模式:工厂方法模式(C++)【简单工厂进行升级】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。