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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单工厂模式(Simple Factory)

發布時間:2024/9/5 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单工厂模式(Simple Factory) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡單工廠模式(Simple Factory)

UML類圖示法

矩形框三層:

  • 第一層:類的名稱,若為抽象類,斜體顯示
  • 第二層:類的特性,通常是字段和屬性
  • 第三層:類的操作,通常是方法或行為
  • 符號:'+':public, '-':private,'#':protected

類與類,類與接口之間的關系

  • 繼承:空心三角形+實線
  • 接口:空心三角形+虛線
  • 關聯:實線箭頭
  • 聚合:空心菱形+實線箭頭
  • 合成(組合)關系:實心的菱形+實線箭頭

簡單工廠模式

概念

簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬于類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。

模式結構

主要用于創建對象。新添加類時,不會影響以前的系統代碼。核心思想是用一個工廠來根據輸入的條件產生不同的類,然后根據不同類的 virtual 函數得到不同的結果。

工廠角色(Creator)是簡單工廠模式的核心,它負責實現創建所有具體產品類的實例。工廠類可以被外界直接調用,創建所需的產品對象。
抽象產品角色(Product)是所有具體產品角色的父類,它負責描述所有實例所共有的公共接口。
具體產品角色(Concrete Product)繼承自抽象產品角色,一般為多個,是簡單工廠模式的創建目標。工廠類返回的都是該角色的某一具體產品。

模式實例與解析(1)

考慮一個簡單的應用場景,一個計算器可以提供多個不同的運算符(如加法、減法、乘法、除法等),這些運算符都源自同一個基類,不過在繼承基類后不同的子類修改了部分屬性從而使得它們可以呈現不同的外觀,如果我們希望在使用這些運算符時,不需要創建這些子類,只需要知道我要做的是加法還是減法,并把符號傳入方法即可返回一個結果,此時,就可以使用簡單工廠模式。

注:所有用例只為體現設計模式思想,不考慮邊界情況,如不考慮除數為0異常等。

#include <iostream>using namespace std;class Operation{ public:virtual double GetResult() = 0;double GetNumA() { return _numA; }double GetNumB() { return _numB; }void SetNum(double a, double b){_numA = a;_numB = b;}virtual ~Operation() = default; private:double _numA = 0;double _numB = 0; };class OperationAdd : public Operation { public:virtual double GetResult(){double res = 0;res = GetNumA() + GetNumB();return res;} };class OperationSub : public Operation { public:virtual double GetResult(){double res = 0;res = GetNumA() - GetNumB();return res;} };class OperationMul : public Operation { public:virtual double GetResult(){double res = 0;res = GetNumA() * GetNumB();return res;} };class OperationDiv : public Operation { public:virtual double GetResult(){double res = 0;res = GetNumA() / GetNumB();return res;} };class CalculatorFactory { public:static Operation* Create(char c){Operation *oper;switch(c){case '+':oper = new OperationAdd();break;case '-':oper = new OperationSub();break;case '*':oper = new OperationMul();break;case '/':oper = new OperationDiv();break;default:oper = new OperationAdd();break;}return oper;} };int main() {int a, b;cin >> a >> b;Operation * op = CalculatorFactory::Create('+');op->SetNum(a, b);double result = op->GetResult();cout << "result = " << result << endl; }

從此以后,如果要加入新的運算符,只需要在新增子類并且在工廠類中的添加相應符號。

模式實例與解析(2)

再考慮一個簡單的應用場景,某商店定期有促銷活動,有滿300返100,打八折,打五折,滿200返50,等等,這些優惠都源自同一個基類,這也可以用工廠模式。

#include <iostream> #include <string> #include <unordered_map>using namespace std;unordered_map<string, int> mp{{"正常收費", 0}, {"滿300返100", 1}, {"打八折", 2}};class CashSuper { public:virtual double accpetCash(double money) = 0; };class CashNormal : public CashSuper { public:virtual double accpetCash(double money){ return money; } };class CashRebate : public CashSuper { public:CashRebate(double moneyRebate):_moneyRebate(moneyRebate){}virtual double accpetCash(double money) { return money * _moneyRebate; } private:double _moneyRebate = 0.9; };class CashReturn : public CashSuper { public:CashReturn(double moneyCondition, double moneyReturn):_moneyCondition(moneyCondition), _moneyReturn(moneyReturn){}double accpetCash(double money){double result = money;if(money >= _moneyCondition){result = money - (money / _moneyCondition) * _moneyReturn; }return result;} private:double _moneyCondition = 0.0;double _moneyReturn = 0.0; };class CashFactory { public:static CashSuper* createCashAccept(string type){int StringValue = mp[type];CashSuper * cs = nullptr;switch(StringValue){case 0:cs = new CashNormal();break;case 1:cs = new CashReturn(300, 100);break;case 2:cs = new CashRebate(0.8);break;}return cs;} };int main() {double total = 0.0;string super;cin >> super;CashSuper *p = CashFactory::createCashAccept(super);total = p->accpetCash(300);cout << "total = " << total << endl;return 0; }

因為C++中switch(expression)中的expression不支持string類表達式,所以為實現功能這里額外調用了unordered_map來匹配字符串。


工廠類中的方法必須是static方法,于是可以通過類名訪問,也可以通過類的實例訪問。而普通方法又叫實例方法,只能通過類的實例訪問。當你需要什么,只需要傳入一個正確的參數,就可以獲取你所要的的對象,而無需知道其創建的細節。如果不用static反而違背了設計模式的初衷!

優缺點

優點:實現對象的創建和對象的使用分離,將對象的創建交給專門的工廠類負責
缺點:工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常復雜。

參考:

  • 《大話設計模式》 程杰

  • https://www.cnblogs.com/Bobby0322/p/4178412.html
  • http://ruby-java.javaeye.com/blog/169854

  • 轉載于:https://www.cnblogs.com/Mered1th/p/10976346.html

    總結

    以上是生活随笔為你收集整理的简单工厂模式(Simple Factory)的全部內容,希望文章能夠幫你解決所遇到的問題。

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