溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

設(shè)計模式之什么是工廠模式

發(fā)布時間:2021-10-28 17:52:16 來源:億速云 閱讀:155 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“設(shè)計模式之什么是工廠模式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“設(shè)計模式之什么是工廠模式”吧!

 01 簡單工廠方法

簡單工廠方法可能是最常見的工廠類創(chuàng)建型模式了,其中有幾個角色,一個是抽象產(chǎn)品角色,一個是具體產(chǎn)品角色,多個具體產(chǎn)品都可以。抽象成同一個抽象產(chǎn)品。拿操作系統(tǒng)舉例,操作系統(tǒng)作為一個抽象產(chǎn)品,它有幾種具體產(chǎn)品角色,有Windows操作系統(tǒng),有Android操作系統(tǒng),有iOS操作系統(tǒng)。有一個操作系統(tǒng)的工廠,工廠可以根據(jù)不同的需求生產(chǎn)出不同內(nèi)核的操作系統(tǒng),這個操作系統(tǒng)的工廠就是最后一個角色:工廠角色。

#include <iostream>  enum class BallEnum { BasketBall = 1, SocketBall = 2 };  class Ball { public:    Ball() {}    virtual ~Ball() {}  virtual void Play() {} };  class BasketBall : public Ball { public:     void Play() override { std::cout << "play basketball \n"; } };  class SocketBall : public Ball { public:   void Play() override { std::cout << "play socketball \n"; } };  class SimpleFactory { public:   static Ball* CreateBall(BallEnum type); };  Ball* SimpleFactory::CreateBall(BallEnum type) {   switch (type) {     case BallEnum::BasketBall:       return new BasketBall();     case BallEnum::SocketBall:       return new SocketBall();   }   return nullptr; }  int main() {    Ball* basket = SimpleFactory::CreateBall(BallEnum::BasketBall);    basket->Play();    Ball* socket = SimpleFactory::CreateBall(BallEnum::SocketBall);    socket->Play();    return 0; }

在簡單工廠方法中,有一個專門的工廠類,根據(jù)不同的參數(shù)返回不同具體產(chǎn)品類的實例,這些具體產(chǎn)品可以抽象出同一個抽象產(chǎn)品,即有一個共同的父類。  通過上述代碼您可能也看到了簡單工廠方法的優(yōu)點,實現(xiàn)了對象的創(chuàng)建和使用邏輯分離,只需要傳入不同參數(shù),就可以獲得特定具體類的實例。但簡單工廠方法也有些缺點,當(dāng)增加了新的產(chǎn)品,就需要修改工廠類的創(chuàng)建邏輯,如果產(chǎn)品類型較多,就可能造成工廠類邏輯過于復(fù)雜,不利于系統(tǒng)的維護(hù),適用于具體產(chǎn)品類型比較少并且以后基本不會新加類型的場景,這樣工廠類業(yè)務(wù)邏輯不會太過復(fù)雜。

02 工廠方法模式

為了解決上面簡單工廠方法模式的缺點,進(jìn)一步抽象出了工廠方法模式,工廠類不再負(fù)責(zé)所有產(chǎn)品的構(gòu)建,每一個具體產(chǎn)品都有一個對應(yīng)的工廠,這樣在新加產(chǎn)品時就不會改動已有工廠類的創(chuàng)建邏輯。這些工廠也會抽象出一個抽象工廠??梢岳斫鉃橛兴姆N角色,抽象產(chǎn)品,具體產(chǎn)品,抽象工廠,具體工廠,其實就是把簡單工廠模式中的工廠類做進(jìn)一步抽象,看代碼吧:

#include <iostream>  enum class BallEnum { BasketBall = 1, SocketBall = 2 };  class Ball {   public:    Ball() {}    virtual ~Ball() {}     virtual void Play() {} };  class BasketBall : public Ball {   public:    void Play() override { std::cout << "play basketball \n"; } };  class SocketBall : public Ball {   public:    void Play() override { std::cout << "play socketball \n"; } };  class FactoryBase {   public:    virtual ~FactoryBase() {}    virtual Ball* CreateBall() = 0; };  class BasketBallFactory : public FactoryBase {   public:    Ball* CreateBall() override { return new BasketBall(); } };  class SocketBallFactory : public FactoryBase {   public:    Ball* CreateBall() override { return new SocketBall(); } };  int main() {    FactoryBase* factory;    BallEnum ball_type = BallEnum::SocketBall;    switch (ball_type) {        case BallEnum::BasketBall:            factory = new BasketBallFactory();            break;        case BallEnum::SocketBall:            factory = new SocketBallFactory();            break;   }    Ball* ball = factory->CreateBall();    ball->Play();    return 0; }

工廠模式提高了系統(tǒng)的可擴展性,完全符合開閉原則,當(dāng)新加具體產(chǎn)品時,完全不會對已有系統(tǒng)有任何修改。當(dāng)不知道以后會有多少具體產(chǎn)品時可以考慮使用工廠模式,因為不會降低現(xiàn)有系統(tǒng)的穩(wěn)定性。但是它也有缺點,每當(dāng)新加一個產(chǎn)品時,不僅需要新加一個對應(yīng)的產(chǎn)品類,同時還需要新加一個此產(chǎn)品對應(yīng)的工廠,系統(tǒng)的復(fù)雜度比較高。怎么解決呢,可以再抽象一下:

03 抽象工廠模式

在工廠方法中,每一個抽象產(chǎn)品都會有一個抽象工廠,這樣新增一個產(chǎn)品時都會新增兩個類,一個是具體產(chǎn)品類,一個是具體工廠類,我們可以考慮多個抽象產(chǎn)品對應(yīng)一個抽象工廠,這樣可以有效減少具體工廠類的個數(shù),見如下代碼:

#include <iostream>  enum class BallEnum { BasketBall = 1, SocketBall = 2 };  class Ball {   public:    Ball() {}    virtual ~Ball() {}     virtual void Play() {} };  class BasketBall : public Ball {   public:    void Play() override { std::cout << "play basketball \n"; } };  class SocketBall : public Ball {   public:    void Play() override { std::cout << "play socketball \n"; } };  class Player {   public:    Player() {}    virtual ~Player() {}    virtual void Name() {} };  class BasketBallPlayer : public Player {   public:    void Name() override { std::cout << "BasketBall player \n"; } };  class SocketBallPlayer : public Player {   public:    void Name() override { std::cout << "SocketBall player \n"; } };  class FactoryBase {   public:    virtual ~FactoryBase() {}    virtual Ball* CreateBall() = 0;    virtual Player* CreatePlayer() = 0; };  class BasketBallFactory : public FactoryBase {   public:    Ball* CreateBall() override { return new BasketBall(); }    Player* CreatePlayer() override { return new BasketBallPlayer(); } };  class SocketBallFactory : public FactoryBase {   public:    Ball* CreateBall() override { return new SocketBall(); }    Player* CreatePlayer() override { return new SocketBallPlayer(); } };  int main() {    FactoryBase* factory;    BallEnum ball_type = BallEnum::SocketBall;    switch (ball_type) {        case BallEnum::BasketBall:            factory = new BasketBallFactory();            break;        case BallEnum::SocketBall:            factory = new SocketBallFactory();            break;   }    Ball* ball = factory->CreateBall();    Player* player = factory->CreatePlayer();    ball->Play();    player->Name();    return 0; }

到此,相信大家對“設(shè)計模式之什么是工廠模式”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI