成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

設計模式之工廠模式

開發 前端
簡單工廠方法可能是最常見的工廠類創建型模式了,其中有幾個角色,一個是抽象產品角色,一個是具體產品角色,多個具體產品都可以。抽象成同一個抽象產品。拿操作系統舉例,操作系統作為一個抽象產品,它有幾種具體產品角色,有Windows操作系統,有Android操作系統,有iOS操作系統。

[[338729]]

本文轉載自微信公眾號「程序喵大人」,作者程序喵大人 。轉載本文請聯系程序喵大人公眾號。

 01 簡單工廠方法

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

  1. #include <iostream> 
  2.  
  3. enum class BallEnum { BasketBall = 1, SocketBall = 2 }; 
  4.  
  5. class Ball { 
  6. public
  7.    Ball() {} 
  8.    virtual ~Ball() {} 
  9.  
  10. virtual void Play() {} 
  11. }; 
  12.  
  13. class BasketBall : public Ball { 
  14. public
  15.     void Play() override { std::cout << "play basketball \n"; } 
  16. }; 
  17.  
  18. class SocketBall : public Ball { 
  19. public
  20.   void Play() override { std::cout << "play socketball \n"; } 
  21. }; 
  22.  
  23. class SimpleFactory { 
  24. public
  25.   static Ball* CreateBall(BallEnum type); 
  26. }; 
  27.  
  28. Ball* SimpleFactory::CreateBall(BallEnum type) { 
  29.   switch (type) { 
  30.     case BallEnum::BasketBall: 
  31.       return new BasketBall(); 
  32.     case BallEnum::SocketBall: 
  33.       return new SocketBall(); 
  34.   } 
  35.   return nullptr; 
  36.  
  37. int main() { 
  38.    Ball* basket = SimpleFactory::CreateBall(BallEnum::BasketBall); 
  39.    basket->Play(); 
  40.    Ball* socket = SimpleFactory::CreateBall(BallEnum::SocketBall); 
  41.    socket->Play(); 
  42.    return 0; 

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

02 工廠方法模式

為了解決上面簡單工廠方法模式的缺點,進一步抽象出了工廠方法模式,工廠類不再負責所有產品的構建,每一個具體產品都有一個對應的工廠,這樣在新加產品時就不會改動已有工廠類的創建邏輯。這些工廠也會抽象出一個抽象工廠。可以理解為有四種角色,抽象產品,具體產品,抽象工廠,具體工廠,其實就是把簡單工廠模式中的工廠類做進一步抽象,看代碼吧:

  1. #include <iostream> 
  2.  
  3. enum class BallEnum { BasketBall = 1, SocketBall = 2 }; 
  4.  
  5. class Ball { 
  6.   public
  7.    Ball() {} 
  8.    virtual ~Ball() {} 
  9.  
  10.    virtual void Play() {} 
  11. }; 
  12.  
  13. class BasketBall : public Ball { 
  14.   public
  15.    void Play() override { std::cout << "play basketball \n"; } 
  16. }; 
  17.  
  18. class SocketBall : public Ball { 
  19.   public
  20.    void Play() override { std::cout << "play socketball \n"; } 
  21. }; 
  22.  
  23. class FactoryBase { 
  24.   public
  25.    virtual ~FactoryBase() {} 
  26.    virtual Ball* CreateBall() = 0; 
  27. }; 
  28.  
  29. class BasketBallFactory : public FactoryBase { 
  30.   public
  31.    Ball* CreateBall() override { return new BasketBall(); } 
  32. }; 
  33.  
  34. class SocketBallFactory : public FactoryBase { 
  35.   public
  36.    Ball* CreateBall() override { return new SocketBall(); } 
  37. }; 
  38.  
  39. int main() { 
  40.    FactoryBase* factory; 
  41.    BallEnum ball_type = BallEnum::SocketBall; 
  42.    switch (ball_type) { 
  43.        case BallEnum::BasketBall: 
  44.            factory = new BasketBallFactory(); 
  45.            break; 
  46.        case BallEnum::SocketBall: 
  47.            factory = new SocketBallFactory(); 
  48.            break; 
  49.   } 
  50.    Ball* ball = factory->CreateBall(); 
  51.    ball->Play(); 
  52.    return 0; 

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

03 抽象工廠模式

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

  1. #include <iostream> 
  2.  
  3. enum class BallEnum { BasketBall = 1, SocketBall = 2 }; 
  4.  
  5. class Ball { 
  6.   public
  7.    Ball() {} 
  8.    virtual ~Ball() {} 
  9.  
  10.    virtual void Play() {} 
  11. }; 
  12.  
  13. class BasketBall : public Ball { 
  14.   public
  15.    void Play() override { std::cout << "play basketball \n"; } 
  16. }; 
  17.  
  18. class SocketBall : public Ball { 
  19.   public
  20.    void Play() override { std::cout << "play socketball \n"; } 
  21. }; 
  22.  
  23. class Player { 
  24.   public
  25.    Player() {} 
  26.    virtual ~Player() {} 
  27.    virtual void Name() {} 
  28. }; 
  29.  
  30. class BasketBallPlayer : public Player { 
  31.   public
  32.    void Name() override { std::cout << "BasketBall player \n"; } 
  33. }; 
  34.  
  35. class SocketBallPlayer : public Player { 
  36.   public
  37.    void Name() override { std::cout << "SocketBall player \n"; } 
  38. }; 
  39.  
  40. class FactoryBase { 
  41.   public
  42.    virtual ~FactoryBase() {} 
  43.    virtual Ball* CreateBall() = 0; 
  44.    virtual Player* CreatePlayer() = 0; 
  45. }; 
  46.  
  47. class BasketBallFactory : public FactoryBase { 
  48.   public
  49.    Ball* CreateBall() override { return new BasketBall(); } 
  50.    Player* CreatePlayer() override { return new BasketBallPlayer(); } 
  51. }; 
  52.  
  53. class SocketBallFactory : public FactoryBase { 
  54.   public
  55.    Ball* CreateBall() override { return new SocketBall(); } 
  56.    Player* CreatePlayer() override { return new SocketBallPlayer(); } 
  57. }; 
  58.  
  59. int main() { 
  60.    FactoryBase* factory; 
  61.    BallEnum ball_type = BallEnum::SocketBall; 
  62.    switch (ball_type) { 
  63.        case BallEnum::BasketBall: 
  64.            factory = new BasketBallFactory(); 
  65.            break; 
  66.        case BallEnum::SocketBall: 
  67.            factory = new SocketBallFactory(); 
  68.            break; 
  69.   } 
  70.    Ball* ball = factory->CreateBall(); 
  71.    Player* player = factory->CreatePlayer(); 
  72.    ball->Play(); 
  73.    player->Name(); 
  74.    return 0; 

總結

系統的復雜度不會被消除,只能被轉移。系統總會有穩定部分和不穩定部分,只是我們要合理選擇好邊界,認真思考,考慮好將哪部分打造成穩定部分,哪部分打造成不穩定部分。簡單工廠方法模式中if-else的邏輯在工廠類里,如果這里在新增一個產品時有bug可能導致所有產品都創建失敗,這里是不穩定部分,所以有了工廠方法模式,將工廠類內部打造成穩定部分,將不穩定的邏輯轉移到外面。

 

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2011-11-17 16:03:05

Java工廠模式Clojure

2021-03-06 22:50:58

設計模式抽象

2010-04-19 09:30:00

工廠模式PHP設計模式

2009-01-15 10:55:29

JavaScript設計模式抽象工廠

2022-01-12 13:33:25

工廠模式設計

2011-07-28 09:50:58

設計模式

2019-08-16 10:46:46

JavaScript工廠模式抽象工廠模式

2022-05-09 08:04:50

工廠模式設計模式

2021-09-29 13:53:17

抽象工廠模式

2020-10-19 09:28:00

抽象工廠模式

2020-08-11 11:20:30

Typescript設計模式

2024-09-23 08:30:48

2011-07-21 14:33:02

設計模式

2010-10-09 09:25:35

Python工廠模式

2024-07-31 08:12:33

2013-11-26 16:29:22

Android設計模式

2015-11-03 09:43:43

avascript設計模式工廠模式

2021-06-09 08:53:34

設計模式策略模式工廠模式

2012-02-29 09:41:14

JavaScript

2015-09-08 13:39:10

JavaScript設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品永久久久久 | 黄一区二区三区 | 韩国av网站在线观看 | 日本精品视频一区二区 | 久久久久久高清 | av免费观看在线 | 黄色网毛片 | 精品国产视频 | 精品视频 免费 | 久久大陆| 亚洲成人一区 | 粉嫩av久久一区二区三区 | 国产精品入口久久 | 国产乱码久久久 | 欧美8一10sex性hd | 四虎影视免费观看 | 中文字幕高清 | 99精品久久久久久中文字幕 | 精品久久一 | 伊人久久在线观看 | 精品久久久久久 | jdav视频在线观看免费 | 在线播放国产一区二区三区 | 天天综合久久 | 欧洲高清转码区一二区 | 中文字幕在线看人 | 狠狠色综合久久丁香婷婷 | 日本精品一区二区三区视频 | 久久中文字幕一区 | 精品国产欧美日韩不卡在线观看 | 日韩av一区二区在线观看 | av在线免费网 | 91精品国产91久久久久久最新 | 看一级毛片 | 免费成人在线网站 | 午夜影院在线观看免费 | 国产精品久久久久久久久久免费看 | aaa级片 | 国产精品亚洲一区 | 成人在线一区二区三区 | 亚洲欧美中文日韩在线v日本 |