文章目錄
- 🌳概念
- 🌳 簡單工廠模式
- 🌳 工廠方法模式
- 🌳 抽象工廠模式
🌳概念
為了提高內(nèi)聚(Cohesion)和松耦合(Coupling),我們經(jīng)常會抽象出一些類的公共 接口以形成抽象基類或者接口。這樣我們可以通過聲明一個指向基類的指針來指向?qū)嶋H的子 類實現(xiàn),達(dá)到了多態(tài)的目的。
工廠模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。通過定義創(chuàng)建對象的接口,封裝了對象的創(chuàng)建;使得類的實例化工作延遲到了子類中。
工廠模式的實現(xiàn)方式可分為簡單工廠模式、工廠方法模式、抽象工廠模式。
🌳 簡單工廠模式
🍞具體的情形:一個機器視覺光源生產(chǎn)商,生產(chǎn)的產(chǎn)品有條形光、同軸光、環(huán)形光。
🍔簡單工廠模式結(jié)構(gòu)組成:
工廠類:lightFoctory,工廠模式的核心類,會定義一個用于創(chuàng)建指定的具體實例對象的接口。
抽象產(chǎn)品類:Light,是具體產(chǎn)品類的繼承的父類或?qū)崿F(xiàn)的接口。
具體產(chǎn)品類:BarLight、RingLight、CoaxialLight工廠類所創(chuàng)建的對象就是此具體產(chǎn)品實例。
🍟 簡單工廠的缺點:
擴(kuò)展性差,新增產(chǎn)品的時候,需要去修改工廠類。違法了開閉法則(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;
}
🧀運行結(jié)果:
🌳 工廠方法模式
🍞具體情形:
機器視覺行業(yè)火爆,需要大量生產(chǎn)每種類型的光源,則要針對不同類型的光源開設(shè)獨立的生產(chǎn)線,那么每個生產(chǎn)線就只能生產(chǎn)同類型的光源。
🍔工廠方法模式的結(jié)構(gòu)組成:
抽象工廠類:LightFactoryBase,工廠方法模式的核心類,提供創(chuàng)建具體產(chǎn)品的接口,由具體工廠類實現(xiàn)。
具體工廠類:CoaxialLightFoctory、RingLightFoctory、BarLightFoctory,繼承于抽象工廠,實現(xiàn)創(chuàng)建對應(yīng)具體產(chǎn)品對象的方式。
抽象產(chǎn)品類:Light,它是具體產(chǎn)品繼承的父類(基類)。
具體產(chǎn)品類:BarLight、RingLight、CoaxialLight具體工廠所創(chuàng)建的對象,就是此類。
🍟 工廠方法缺點:
每增加一種產(chǎn)品,就需要增加一個對象的工廠。相比簡單工廠模式而言,工廠方法模式需要更多的類定義。
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;
}
🧀運行結(jié)果:
🌳 抽象工廠模式
🍞具體情形:
光源生產(chǎn)商調(diào)研發(fā)現(xiàn)家用光源也很賺錢,現(xiàn)在投資兩個廠房,一個生產(chǎn)機器視覺和家用條形光,一個生產(chǎn)機器視覺和家用環(huán)形光。
🍔抽象工廠模式結(jié)構(gòu)組成:
抽象工廠類:LightFoctoryBase,工廠方法模式的核心類,提供創(chuàng)建具體產(chǎn)品的接口,由具體工廠類實現(xiàn)。
具體工廠類:BarLightFoctory、RingLightFoctory,繼承于抽象工廠,實現(xiàn)創(chuàng)建對應(yīng)具體產(chǎn)品對象的方式。
抽象產(chǎn)品類:LightFoctory、MachineVisionLight它是具體產(chǎn)品繼承的父類(基類)。
具體產(chǎn)品類:HouseholdBarLight,HouseholdRingLight、MachineVisionBarLight、RingLightFoctory,具體工廠所創(chuàng)建的對象,就是此類。
🍟 工廠方法模式缺點:
同工廠方法模式一樣,新增產(chǎn)品時,都需要增加一個對應(yīng)的產(chǎn)品的具體工廠類。
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
;
}
🧀運行結(jié)果;
總結(jié)
以上是生活随笔為你收集整理的GoF设计模式——工厂模式(C++实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。