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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

工厂模式C++实现(三种工厂模式附详细注释)

發布時間:2024/3/13 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 工厂模式C++实现(三种工厂模式附详细注释) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

工廠模式(統稱)

工廠模式是一種創建型模式,適用場景:安全的創建對象。

簡單工廠模式

顧名思義,工廠是用來生產東西的,而在C++里面就是用來生產對象的。
就像一家餐廳一樣,你可以按照你的方式來點餐。在工廠模式中也一樣,你可以要求工廠為你生產不同的對象。
閑話不多說,直接上代碼!

#include<iostream> #include<string> using namespace std; class Produce;//聲明產品類 class Factory;//聲明工廠類 class Factory {public:Factory(){}~Factory(){}virtual Produce* create_produce(string class_name,string name)=0;//工廠生產產品,這里的純虛函數是為了讓子工廠生產產品//返回的是一個產品類指針,這就代表了一個產品//這里的name參數是為了返回想要的產品qwq }; class Produce {public:Produce(){}~Produce(){}virtual void show_myname()=0;//這里定義的純虛函數是為了讓派生類去實現這個函數,有純虛函數的類是抽象類 }; //現在我要開始創建具體的產品了 class Produce_apple:public Produce//這是一個具體的蘋果類 {private:string name;public:Produce_apple(string new_name=""){this->name = new_name;}virtual void show_myname()//重寫父類函數 {cout<<"我的名稱是:"<<name<<endl;} }; class Produce_pear:public Produce//這是一個具體的梨類 {private:string name;public:Produce_pear(string new_name=""){this->name = new_name;}virtual void show_myname()//重寫父類函數{cout<<"我的名稱是:"<<name<<endl;} }; class Produce_badfruits:public Produce//這是一個具體的壞水果類 {private:string name;public:Produce_badfruits(){}virtual void show_myname()//重寫父類函數{cout<<"此產品已經過期!!"<<endl;} }; //下面開始創建具體的工廠類 class Factory_fruits:public Factory//這是個水果工廠類 {public:Factory_fruits(){}~Factory_fruits(){}virtual Produce* create_produce(string class_name,string name){if (class_name=="apple"){Produce * my_produce = new Produce_apple(name);//創建name的apple產品 return my_produce;}else if (class_name=="pear"){Produce * my_produce = new Produce_pear(name);//創建name的pear產品return my_produce;}else{Produce * my_produce = new Produce_badfruits();//創建name的pear產品return my_produce;}} }; //初期的搭建工作已經完成,總結一下,我們搭建了兩個抽象類:工廠類,產品類;//產品派生類:蘋果類,梨類,壞水果類//工廠派生類:水果工廠類。//現在我們要用這些東西了 int main() {Factory * my_factory_fruits = new Factory_fruits();//創建一個抽象工廠對象"升級"為水果工廠//這里的"升級"是我的理解 ,事實上是類型轉換 Produce * my_produce_apple = my_factory_fruits->create_produce("apple","紅富士");//創建抽象產品對象,"升級"為水果工廠加工出來的apple,紅富士 Produce * my_produce_pear = my_factory_fruits->create_produce("pear","冰糖雪梨");//創建抽象產品對象,"升級"為水果工廠加工出來的pear,冰糖雪梨Produce * my_produce_banana = my_factory_fruits->create_produce("banana","大香蕉");//創建抽象產品對象,"升級"為水果工廠加工出來的banana,大香蕉,但是工廠不能生產banana,所以只能生產badfruit壞水果 my_produce_apple->show_myname();//產品顯示自己的名稱 my_produce_pear->show_myname();//產品顯示自己的名稱my_produce_banana->show_myname();//產品顯示自己的名稱//下面是銷毀內存delete my_factory_fruits;my_factory_fruits = NULL;delete my_produce_apple;my_produce_apple = NULL;delete my_produce_pear;my_produce_pear = NULL;delete my_produce_banana;my_produce_banana = NULL;return 0; }

這是一個簡單工廠模式,在實際的程序開發中,可以將那些具體的產品類編譯成DLL,這樣可以做到熱更新!

工廠模式

顧名思義工廠模式,并沒有那么簡單qwq.他不是像簡單工廠那樣一個水果工廠可以生產各種水果,而是一種工廠生產一種水果。就比如蘋果工廠生產蘋果,梨子工廠生產梨子。這樣分開的好處是什么呢???
我看了很多博客,他們都提到了 開放-封閉原則,我用我自己的話來說,就是如果你想增加新西瓜的產品的話。用簡單工廠模式需要增加一個西瓜類,然后在水果工廠里面增加分支。用工廠模式的話需要增加一個西瓜類和一個西瓜類工廠。。。
但是我們的老師經常教導我們,不要改源碼!!!如果用的是簡單工廠模式就必須改源碼中的條件分支,這會被老師罵死的qwq。所以用工廠模式就不用改源碼,只用增加代碼即可,媽媽再也不用擔心我被罵了。
上代碼!!

#include<iostream> #include<string> using namespace std; class Produce;//聲明產品類 class Factory;//聲明工廠類 class Factory {public:Factory(){}~Factory(){}virtual Produce* create_produce(string name)=0;//工廠生產產品,這里的純虛函數是為了讓子工廠生產產品//返回的是一個產品類指針,這就代表了一個產品//這里的name參數是為了返回想要的產品qwq }; class Produce {public:Produce(){}~Produce(){}virtual void show_myname()=0;//這里定義的純虛函數是為了讓派生類去實現這個函數,有純虛函數的類是抽象類 }; //現在我要開始創建具體的產品了 class Produce_apple:public Produce//這是一個具體的蘋果類 {private:string name;public:Produce_apple(string new_name=""){this->name = new_name;}virtual void show_myname()//重寫父類函數 {cout<<"我的名稱是:"<<name<<endl;} }; class Produce_pear:public Produce//這是一個具體的梨類 {private:string name;public:Produce_pear(string new_name=""){this->name = new_name;}virtual void show_myname()//重寫父類函數{cout<<"我的名稱是:"<<name<<endl;} }; class Produce_banana:public Produce//這是一個具體的壞水果類 {private:string name;public:Produce_banana(string new_name=""){this->name = new_name;}virtual void show_myname()//重寫父類函數{cout<<"我的名稱是:"<<name<<endl;} }; //下面開始創建具體的工廠類 class Factory_apple:public Factory//這是個水果工廠類 {public:Factory_apple(){}~Factory_apple(){}virtual Produce* create_produce(string name){Produce * my_produce = new Produce_apple(name);//創建name的apple產品 return my_produce;} }; class Factory_pear:public Factory//這是個水果工廠類 {public:Factory_pear(){}~Factory_pear(){}virtual Produce* create_produce(string name){Produce * my_produce = new Produce_pear(name);//創建name的pear產品 return my_produce;} }; class Factory_banana:public Factory//這是個水果工廠類 {public:Factory_banana(){}~Factory_banana(){}virtual Produce* create_produce(string name){Produce * my_produce = new Produce_banana(name);//創建name的badfruits產品 return my_produce;} }; //初期的搭建工作已經完成,總結一下,我們搭建了兩個抽象類:工廠類,產品類;//產品派生類:蘋果類,梨類,壞水果類//工廠派生類:蘋果工廠類。梨類工廠類。壞水果工廠類 //現在我們要用這些東西了 int main() {Factory * my_factory_apple = new Factory_apple();//創建一個抽象工廠對象"升級"為蘋果工廠//這里的"升級"是我的理解 ,事實上是類型轉換Factory * my_factory_pear = new Factory_pear();//創建一個抽象工廠對象"升級"為梨子工廠Factory * my_factory_banana = new Factory_banana();//創建一個抽象工廠對象"升級"為香蕉工廠Produce * my_produce_apple = my_factory_apple->create_produce("紅富士");//創建抽象產品對象,"升級"為蘋果工廠加工出來的apple,紅富士 Produce * my_produce_pear = my_factory_pear->create_produce("冰糖雪梨");//創建抽象產品對象,"升級"為梨子工廠加工出來的pear,冰糖雪梨Produce * my_produce_banana = my_factory_banana->create_produce("大香蕉");//創建抽象產品對象,"升級"為香蕉工廠加工出來的banana my_produce_apple->show_myname();//產品顯示自己的名稱 my_produce_pear->show_myname();//產品顯示自己的名稱my_produce_banana->show_myname();//產品顯示自己的名稱//下面是銷毀內存delete my_factory_apple;my_factory_apple = NULL;delete my_factory_pear;my_factory_pear = NULL;delete my_factory_banana;my_factory_banana = NULL;delete my_produce_apple;my_produce_apple = NULL;delete my_produce_pear;my_produce_pear = NULL;delete my_produce_banana;my_produce_banana = NULL;return 0; }

抽象工廠模式

顧名思義這個模式比普通的工廠模式抽象一點。
按照我個人的理解,簡單工廠模式,工廠模式,抽象模式主要的差別就在與工廠的分類不同。
簡單工廠模式:一個產品一個工廠,十個產品一個工廠。總結:工廠可以生產所有產品
工廠模式:一個產品一個工廠,十個產品十個工廠。總結:工廠只能生產一個產品
抽象工廠模式:N個產品M個工廠。總結:工廠可以靈活的生產商品。

還是按剛才的例子,我現在要賣蘋果,蘋果汁,梨子,梨子汁。
簡單工廠模式就是1個工廠賣四個產品。
工廠模式就是創建四個工廠賣四個產品。
抽象工廠模式就不一樣:我可以創建兩個工廠。一個專門賣蘋果類的,一個專門賣梨子類的,除了這樣的分類,還可以進行其他的分類,十分的靈活!

閑話不多說,上代碼!!

#include<iostream> #include<string> using namespace std; class Produce_fruits;//聲明水果產品類 class Produce_fruits_juice;//聲明水果汁產品類 class Factory;//聲明工廠類 class Factory {public:Factory(){}~Factory(){}virtual Produce_fruits* create_produce(string name)=0;//工廠生產產品,這里的純虛函數是為了讓子工廠生產產品//返回的是一個產品類指針,這就代表了一個產品//這里的name參數是為了返回想要的產品qwqvirtual Produce_fruits_juice* create_produce_juice(string name)=0;//工廠生產產品,這里的純虛函數是為了讓子工廠生產產品//返回的是一個產品類指針,這就代表了一個產品//這里的name參數是為了返回想要的產品qwq }; class Produce_fruits {public:Produce_fruits(){}~Produce_fruits(){}virtual void show_myname()=0;//這里定義的純虛函數是為了讓派生類去實現這個函數,有純虛函數的類是抽象類 }; class Produce_fruits_juice {public:Produce_fruits_juice(){}~Produce_fruits_juice(){}virtual void show_myname()=0;//這里定義的純虛函數是為了讓派生類去實現這個函數,有純虛函數的類是抽象類 }; //現在我要開始創建具體的產品了 class Produce_apple:public Produce_fruits//這是一個具體的蘋果類 {private:string name;public:Produce_apple(string new_name=""){this->name = new_name;}virtual void show_myname()//重寫父類函數 {cout<<"我的名稱是:"<<name<<"(水果)"<<endl;} }; class Produce_pear:public Produce_fruits//這是一個具體的梨類 {private:string name;public:Produce_pear(string new_name=""){this->name = new_name;}virtual void show_myname()//重寫父類函數{cout<<"我的名稱是:"<<name<<"(水果)"<<endl;} }; class Produce_apple_juice:public Produce_fruits_juice//這是一個具體的蘋果類 {private:string name;public:Produce_apple_juice(string new_name=""){this->name = new_name;}virtual void show_myname()//重寫父類函數 {cout<<"我的名稱是:"<<name<<"(果汁)"<<endl;} }; class Produce_pear_juice:public Produce_fruits_juice//這是一個具體的梨類 {private:string name;public:Produce_pear_juice(string new_name=""){this->name = new_name;}virtual void show_myname()//重寫父類函數{cout<<"我的名稱是:"<<name<<"(果汁)"<<endl;} }; //下面開始創建具體的工廠類 class Factory_apple:public Factory//這是個蘋果工廠類 {public:Factory_apple(){}~Factory_apple(){}virtual Produce_fruits* create_produce(string name){Produce_fruits * my_produce = new Produce_apple(name);//創建name的蘋果產品 return my_produce;}virtual Produce_fruits_juice* create_produce_juice(string name){Produce_fruits_juice * my_produce = new Produce_apple_juice(name);//創建name的蘋果汁產品 return my_produce;} }; class Factory_pear:public Factory//這是個梨工廠類 {public:Factory_pear(){}~Factory_pear(){}virtual Produce_fruits* create_produce(string name){Produce_fruits * my_produce = new Produce_pear(name);//創建name的梨子產品 return my_produce;}virtual Produce_fruits_juice* create_produce_juice(string name){Produce_fruits_juice * my_produce = new Produce_pear_juice(name);//創建name的梨子汁產品 return my_produce;} }; //初期的搭建工作已經完成,總結一下,我們搭建了兩個抽象類:工廠類,水果產品類,果汁產品類;//產品派生類:蘋果類,梨類,蘋果汁類,梨汁類,//工廠派生類:蘋果工廠類,梨子工廠類。//現在我們要用這些東西了 int main() {Factory * my_factory_apple = new Factory_apple();//創建一個抽象工廠對象"升級"為蘋果工廠//這里的"升級"是我的理解 ,事實上是類型轉換Factory * my_factory_pear = new Factory_pear();//創建一個抽象工廠對象"升級"為梨子工廠//這里的"升級"是我的理解 ,事實上是類型轉換 Produce_fruits * my_produce_apple = my_factory_apple->create_produce("紅富士");//創建抽象產品對象,"升級"為蘋果工廠加工出來的紅富士 Produce_fruits * my_produce_pear = my_factory_pear->create_produce("鴨梨");//創建抽象產品對象,"升級"為梨子工廠加工出來的鴨梨Produce_fruits_juice * my_produce_apple_juice = my_factory_apple->create_produce_juice("紅蘋果汁");//創建抽象產品對象,"升級"為蘋果工廠加工出來的紅蘋果汁Produce_fruits_juice * my_produce_pear_juice = my_factory_pear->create_produce_juice("冰糖雪梨果汁");//創建抽象產品對象,"升級"為梨子工廠加工出來的冰糖雪梨果汁 my_produce_apple->show_myname();//產品顯示自己的名稱 my_produce_pear->show_myname();//產品顯示自己的名稱my_produce_apple_juice->show_myname();//產品顯示自己的名稱my_produce_pear_juice->show_myname();//產品顯示自己的名稱//下面是銷毀內存 delete my_factory_apple;my_factory_apple = NULL;delete my_factory_pear;my_factory_pear = NULL;delete my_produce_apple;my_produce_apple = NULL;delete my_produce_pear;my_produce_pear = NULL;delete my_produce_apple_juice;my_produce_apple_juice = NULL;delete my_produce_pear_juice;my_produce_pear_juice = NULL;return 0; }

總結:

##### 特點: 簡單工廠模式:一個工廠N個產品 工廠模式:N個工廠N個產品 抽象工廠模式:N個工廠M個產品 ##### 缺點(相對): 簡單工廠模式:違背了開放封閉原則(改動源碼),產品多了會比較雜 工廠模式:產品多了會很雜,代碼量稍大,產品多了會比較雜 抽象工廠模式:違背了開放封閉原則(改動源碼),代碼量大,產品多了會比較非常雜 ##### 優點(相對): 簡單工廠模式:代碼量小,方便添加新的產品 工廠模式:不違背了開放封閉原則(不改動源碼),方便添加新的產品 抽象工廠模式:模式靈活,調用方便

在實際開發中可以混用,人的思維是靈活的,代碼才是靈活的,功能才是靈活的,不同的工具靈活使用才能發揮出最大的功能

總結

以上是生活随笔為你收集整理的工厂模式C++实现(三种工厂模式附详细注释)的全部內容,希望文章能夠幫你解決所遇到的問題。

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