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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

GoF设计模式——工厂模式(C++实现)

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

文章目錄

    • 🌳概念
    • 🌳 簡單工廠模式
    • 🌳 工廠方法模式
    • 🌳 抽象工廠模式

🌳概念

為了提高內聚(Cohesion)和松耦合(Coupling),我們經常會抽象出一些類的公共 接口以形成抽象基類或者接口。這樣我們可以通過聲明一個指向基類的指針來指向實際的子 類實現,達到了多態的目的。
工廠模式屬于創建型模式,它提供了一種創建對象的最佳方式。通過定義創建對象的接口,封裝了對象的創建;使得類的實例化工作延遲到了子類中。
工廠模式的實現方式可分為簡單工廠模式、工廠方法模式、抽象工廠模式。

🌳 簡單工廠模式

🍞具體的情形:一個機器視覺光源生產商,生產的產品有條形光、同軸光、環形光。


🍔簡單工廠模式結構組成:

  • 工廠類:lightFoctory,工廠模式的核心類,會定義一個用于創建指定的具體實例對象的接口。

  • 抽象產品類:Light,是具體產品類的繼承的父類或實現的接口。

  • 具體產品類:BarLight、RingLight、CoaxialLight工廠類所創建的對象就是此具體產品實例。

  • 🍟 簡單工廠的缺點:
    擴展性差,新增產品的時候,需要去修改工廠類。違法了開閉法則(OCP)

    #include<QDebug> enum LIGHTTYPE {BAR,RING,COAXIAL};class Light { public:Light(){};virtual ~Light(){};virtual void work() = 0; };class BarLight : public Light {public:void work() {qDebug()<<"BarLight!"<<'\t';} };class RingLight:public Light {public:void work() {qDebug()<<"RingLight!"<<'\t';} };class CoaxialLight:public Light {public:void work() {qDebug()<<"CoaxialLight!"<<'\t';} };class LightFoctory {public:Light* product(LIGHTTYPE type){switch(type){case BAR:return new BarLight();break;case RING:return new RingLight();break;case COAXIAL:return new CoaxialLight();break;default:break;}} };int main(int argc, char *argv[]) {LightFoctory factory;Light* barLight = factory.product(BAR);barLight->work();Light* ringLight = factory.product(RING);ringLight->work();Light* coaxialLight = factory.product(COAXIAL);coaxialLight->work();delete barLight;delete ringLight;delete coaxialLight;return 0; }

    🧀運行結果:

    🌳 工廠方法模式

    🍞具體情形:
    機器視覺行業火爆,需要大量生產每種類型的光源,則要針對不同類型的光源開設獨立的生產線,那么每個生產線就只能生產同類型的光源。

    🍔工廠方法模式的結構組成:

  • 抽象工廠類:LightFactoryBase,工廠方法模式的核心類,提供創建具體產品的接口,由具體工廠類實現。

  • 具體工廠類:CoaxialLightFoctory、RingLightFoctory、BarLightFoctory,繼承于抽象工廠,實現創建對應具體產品對象的方式。

  • 抽象產品類:Light,它是具體產品繼承的父類(基類)。

  • 具體產品類:BarLight、RingLight、CoaxialLight具體工廠所創建的對象,就是此類。

  • 🍟 工廠方法缺點:
    每增加一種產品,就需要增加一個對象的工廠。相比簡單工廠模式而言,工廠方法模式需要更多的類定義。

    class Light { public:Light(){};virtual ~Light(){};virtual void work() = 0; };class BarLight : public Light {public:void work() {qDebug()<<"BarLight!"<<'\t';} };class RingLight:public Light {public:void work() {qDebug()<<"RingLight!"<<'\t';} };class CoaxialLight:public Light {public:void work() {qDebug()<<"CoaxialLight!"<<'\t';} }; class LightFactoryBase {public:virtual Light * product() = 0; };class CoaxialLightFoctory:public LightFactoryBase {public:Light * product(){return new CoaxialLight();} };class RingLightFoctory:public LightFactoryBase {public:Light * product(){return new RingLight();} };class BarLightFoctory:public LightFactoryBase {public:Light * product(){return new BarLight();} };int main(int argc, char *argv[]) {CoaxialLightFoctory coaxialLightFactory;Light* barLight = coaxialLightFactory.product();barLight->work();RingLightFoctory ringLightFoctory;Light* ringLight = ringLightFoctory.product();ringLight->work();BarLightFoctory barLightFoctory;Light* coaxialLight = barLightFoctory.product();coaxialLight->work();delete barLight;delete ringLight;delete coaxialLight;return 0; }

    🧀運行結果:

    🌳 抽象工廠模式

    🍞具體情形:
    光源生產商調研發現家用光源也很賺錢,現在投資兩個廠房,一個生產機器視覺和家用條形光,一個生產機器視覺和家用環形光。

    🍔抽象工廠模式結構組成:

  • 抽象工廠類:LightFoctoryBase,工廠方法模式的核心類,提供創建具體產品的接口,由具體工廠類實現。

  • 具體工廠類:BarLightFoctory、RingLightFoctory,繼承于抽象工廠,實現創建對應具體產品對象的方式。

  • 抽象產品類:LightFoctory、MachineVisionLight它是具體產品繼承的父類(基類)。

  • 具體產品類:HouseholdBarLight,HouseholdRingLight、MachineVisionBarLight、RingLightFoctory,具體工廠所創建的對象,就是此類。

  • 🍟 工廠方法模式缺點:
    同工廠方法模式一樣,新增產品時,都需要增加一個對應的產品的具體工廠類。

    class HouseholdLight{public:HouseholdLight(){};virtual ~HouseholdLight(){};virtual void work() = 0;};class HouseholdBarLight : public HouseholdLight{public:void work() {qDebug()<<"HouseholdBarLight!"<<'\t';}};class HouseholdRingLight:public HouseholdLight{public:void work() {qDebug()<<"HouseholdRingLight!"<<'\t';}};/class MachineVisionLight{public:MachineVisionLight(){};virtual ~MachineVisionLight(){};virtual void work() = 0;};class MachineVisionBarLight : public MachineVisionLight{public:void work() {qDebug()<<"MachineVisionBarLight!"<<'\t';}};class MachineVisionRingLight:public MachineVisionLight{public:void work() {qDebug()<<"MachineVisionRingLight!"<<'\t';}};//class LightFactoryBase{public:virtual MachineVisionLight * productMachineVisionLight() = 0;virtual HouseholdLight * productHouseholdLight() = 0;};class RingLightFoctory:public LightFactoryBase{public:HouseholdLight * productHouseholdLight(){return new HouseholdRingLight();}MachineVisionLight * productMachineVisionLight(){return new MachineVisionRingLight();}};class BarLightFoctory:public LightFactoryBase{public:HouseholdLight * productHouseholdLight(){return new HouseholdBarLight();}MachineVisionLight * productMachineVisionLight(){return new MachineVisionBarLight();}};int main(int argc, char *argv[]) {BarLightFoctory barLightFoctory;RingLightFoctory ringLightFoctory;HouseholdLight *houseBarLight = nullptr;MachineVisionLight *mvBarLight = nullptr;houseBarLight = barLightFoctory.productHouseholdLight();mvBarLight = barLightFoctory.productMachineVisionLight();houseBarLight->work();mvBarLight->work();HouseholdLight *houseRingLight = nullptr;MachineVisionLight *mvRingLight = nullptr;houseRingLight = ringLightFoctory.productHouseholdLight();mvRingLight = ringLightFoctory.productMachineVisionLight();houseRingLight->work();mvRingLight->work();delete houseBarLight;delete mvBarLight;delete houseRingLight;delete mvRingLight;return 0; }

    🧀運行結果;

    總結

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

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