設計模式:抽象原廠模式(C++)【Factory 方法升級】__C++

來源:互聯網
上載者:User
抽象原廠模式介紹

在上一集的設計模式:Factory 方法模式(C++)我們使用Factory 方法模式能帶來一系列的好處,我們將產生產品的工廠類進行了抽象化,一種產品 用專門的工廠進行生產。我們也知道 當產品種類特別多的時候 我們的工廠類會變的非常的多 ,產品有多少種,那麼我們產生對應產品的工廠列就有多少種。難度沒有更好一點的辦法麼。當然有嘛,有更好的設計模式來解決這個問題嘛。試想一下 一個工廠難道就只能產生一種產品。當然不是,可以生產一系列的產品。那麼我們就可以進一步的抽象,工廠能夠產生一系列的產品。

我們的抽象原廠模式 就是將工廠進行抽象 ,但是它是生產一系列的產品 ,它是針對產品族的。產品 對應的有多個產品系列。比如說我們以汽車工廠舉例,抽象的汽車工廠可以生產寶馬車、平治車、哈弗車。我們的具體工廠->中國工廠生產 國產寶馬、國產平治、國產哈弗 這一系列的產品。寶馬產品族 可以有 國產寶馬、日產寶馬、美國產的寶馬。請看下面的模型圖。

抽象原廠模式模型圖
抽象原廠模式代碼 Car.h 汽車類相關代碼

#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>using namespace std;//寶馬汽車基類 抽象寶馬車class BMWCar{public:BMWCar(string name){this->name = name;}virtual void run() = 0;//純虛函數void setName(string name){this->name = name;}string getName(){return this->name;}private:string name;};//平治汽車基類 抽象平治車class BenzCar{public:BenzCar(string name){this->name = name;}virtual void run() = 0;//純虛函數void setName(string name){this->name = name;}string getName(){return this->name;}private:string name;};//哈弗汽車基類 抽象哈弗車class HavalCar{public:HavalCar(string name){this->name = name;}virtual void run() = 0;//純虛函數void setName(string name){this->name = name;}string getName(){return this->name;}private:string name;};//國產寶馬class ChinaBMW :public BMWCar{public:ChinaBMW(string name) :BMWCar(name){}void run(){cout << this->getName() << "已經啟動。" << "國產寶馬汽車歡迎您。" << endl;}};//國產平治class ChinaBenz :public BenzCar{public:ChinaBenz(string name) :BenzCar(name){}void run(){cout << this->getName() << "已經啟動。" << "國產平治汽車歡迎您。" << endl;}};//國產哈弗class ChinaHaval :public HavalCar{public:ChinaHaval(string name) :HavalCar(name){}void run(){cout << this->getName() << "已經啟動。" << "國產哈弗汽車歡迎您。" << endl;}};//美國寶馬class AmericaBMW :public BMWCar{public:AmericaBMW(string name) :BMWCar(name){}void run(){cout << this->getName() << "已經啟動。" << "美國寶馬汽車歡迎您。" << endl;}};//美國平治class AmericaBenz :public BenzCar{public:AmericaBenz(string name) :BenzCar(name){}void run(){cout << this->getName() << "已經啟動。" << "美國平治汽車歡迎您。" << endl;}};//美國哈弗class AmericaHaval :public HavalCar{public:AmericaHaval(string name) :HavalCar(name){}void run(){cout << this->getName() << "已經啟動。" << "美國哈弗汽車歡迎您。" << endl;}};//小日本造的寶馬class JapanBMW :public BMWCar{public:JapanBMW(string name) :BMWCar(name){}void run(){cout << this->getName() << "已經啟動。" << "小日本造的寶馬汽車歡迎您。" << endl;}};//小日本造的平治class JapanBenz :public BenzCar{public:JapanBenz(string name) :BenzCar(name){}void run(){cout << this->getName() << "已經啟動。" << "小日本造的平治汽車歡迎您。" << endl;}};//小日本造的哈弗class JapanHaval :public HavalCar{public:JapanHaval(string name) :HavalCar(name){}void run(){cout << this->getName() << "已經啟動。" << "小日本造的哈弗汽車歡迎您。" << endl;}};

AbstractFactory.cpp 抽象工廠代碼
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include "03 Car.h"using namespace std;/*抽象原廠模式 針對的是產品族每個具體的工廠 將產生不同系列的產品*/class AbstractCarFactory{public:virtual BMWCar* CreateBMWCar() = 0;//純虛函數virtual BenzCar* CreateBenzCar() = 0;virtual HavalCar* CreateHavalCar() = 0;};//中國工廠 在中國生產的系列產品class ChinaCarFactory :public AbstractCarFactory{public:BMWCar* CreateBMWCar(){return new ChinaBMW("中國寶馬");}BenzCar* CreateBenzCar(){return new ChinaBenz("中國平治");}HavalCar* CreateHavalCar(){return new ChinaHaval("中國哈佛");}};//美國工廠 class AmericaCarFactory :public AbstractCarFactory{public:BMWCar* CreateBMWCar(){return new AmericaBMW("美國牌寶馬");}BenzCar* CreateBenzCar(){return new AmericaBenz("美國牌平治");}HavalCar* CreateHavalCar(){return new AmericaHaval("美國牌哈佛");}};//日本工廠class JapanCarFactory :public AbstractCarFactory{public:BMWCar* CreateBMWCar(){return new JapanBMW("小日本造寶馬");}BenzCar* CreateBenzCar(){return new JapanBenz("小日本造平治");}HavalCar* CreateHavalCar(){return new JapanHaval("小日本造哈佛");}};int main(int argc, char *argv[]){AbstractCarFactory *chinaFactroy = new ChinaCarFactory();AbstractCarFactory *americaFactroy = new AmericaCarFactory();AbstractCarFactory *japanFactroy = new JapanCarFactory();//中國工廠生產的系列汽車BMWCar* chinaBMW  = chinaFactroy->CreateBMWCar();BenzCar* chinaBenz = chinaFactroy->CreateBenzCar();HavalCar* chinaHaval = chinaFactroy->CreateHavalCar();//美國工廠生產的系列汽車BMWCar* americaBMW = americaFactroy->CreateBMWCar();BenzCar* americaBenz = americaFactroy->CreateBenzCar();HavalCar*americaHaval = americaFactroy->CreateHavalCar();//小日本工廠生產的系列汽車BMWCar* japanBMW = japanFactroy->CreateBMWCar();BenzCar* japanBenz = japanFactroy->CreateBenzCar();HavalCar*japanHaval = japanFactroy->CreateHavalCar();//汽車跑起來。。。chinaBMW  ->run();chinaBenz ->run();chinaHaval->run();americaBMW->run();americaBenz->run();americaHaval->run();japanBMW->run();japanBenz->run();japanHaval->run();return EXIT_SUCCESS;}
代碼運行結果



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.