• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 183,  comments - 10,  trackbacks - 0

            來(lái)自于《大話設(shè)計(jì)模式》
            工廠方法模式(Factory Method):定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類。

            有一個(gè)操作類 Operation,繼承其而派生出具體各個(gè)操作的操作派生類。
            產(chǎn)生操作類的工廠基類 IFactory,繼承其而派生出產(chǎn)生具體操作類的工廠派生類。

            UML 類圖:


            代碼實(shí)現(xiàn) C++:

              1 #include <iostream>
              2 #include <cmath>
              3 using namespace std;
              4 
              5 class Operation
              6 {
              7 protected:
              8     double NumberA;
              9     double NumberB;
             10 public:
             11     virtual void SetNumberA(double a)
             12     {
             13         NumberA = a;
             14     }
             15     virtual void SetNumberB(double b)
             16     {
             17         NumberB = b;
             18     }
             19     virtual double GetResult() = 0;
             20 };
             21 
             22 class OperationAdd : public Operation
             23 {
             24 public:
             25     virtual double GetResult()
             26     {
             27         return NumberA + NumberB;
             28     }
             29 };
             30 
             31 class OperationSub : public Operation
             32 {
             33 public:
             34     virtual double GetResult()
             35     {
             36         return NumberA - NumberB;
             37     }
             38 };
             39 
             40 class OperationMul : public Operation
             41 {
             42 public:
             43     virtual double GetResult()
             44     {
             45         return NumberA * NumberB;
             46     }
             47 };
             48 
             49 class OperationDiv : public Operation
             50 {
             51 public:
             52     virtual double GetResult()
             53     {
             54         if (NumberB == 0)
             55         {
             56             throw runtime_error("NumberB = 0!");
             57         }
             58         return NumberA / NumberB;
             59     }
             60 };
             61 
             62 class OperationPow : public Operation
             63 {
             64 public:
             65     virtual double GetResult()
             66     {
             67         if (NumberA == 0 && NumberB <= 0)
             68         {
             69             throw runtime_error("NumberA = 0, NumberB <= 0!");
             70         }
             71         return pow(NumberA, NumberB);
             72     }
             73 };
             74 
             75 class IFactory
             76 {
             77 public:
             78     virtual Operation* CreateOperation() = 0;
             79 };
             80 
             81 class AddFactory : public IFactory
             82 {
             83 public:
             84     virtual Operation* CreateOperation()
             85     {
             86         return new OperationAdd;
             87     }
             88 };
             89 
             90 class SubFactory : public IFactory
             91 {
             92 public:
             93     virtual Operation* CreateOperation()
             94     {
             95         return new OperationSub;
             96     }
             97 };
             98 
             99 class MulFactory : public IFactory
            100 {
            101 public:
            102     virtual Operation* CreateOperation()
            103     {
            104         return new OperationMul;
            105     }
            106 };
            107 
            108 class DivFactory : public IFactory
            109 {
            110 public:
            111     virtual Operation* CreateOperation()
            112     {
            113         return new OperationDiv;
            114     }
            115 };
            116 
            117 class PowFactory : public IFactory
            118 {
            119 public:
            120     virtual Operation* CreateOperation()
            121     {
            122         return new OperationPow;
            123     }
            124 };
            125 
            126 int main()
            127 {
            128     double a, b;
            129     while (cin >> a >> b)
            130     {
            131         IFactory* pfactory = new AddFactory;
            132         Operation* poperation = pfactory->CreateOperation();
            133         poperation->SetNumberA(a);
            134         poperation->SetNumberB(b);
            135         cout << poperation->GetResult() << endl;
            136         delete pfactory;
            137         delete poperation;
            138 
            139         pfactory = new SubFactory;
            140         poperation = pfactory->CreateOperation();
            141         poperation->SetNumberA(a);
            142         poperation->SetNumberB(b);
            143         cout << poperation->GetResult() << endl;
            144         delete pfactory;
            145         delete poperation;
            146 
            147         pfactory = new MulFactory;
            148         poperation = pfactory->CreateOperation();
            149         poperation->SetNumberA(a);
            150         poperation->SetNumberB(b);
            151         cout << poperation->GetResult() << endl;
            152         delete pfactory;
            153         delete poperation;
            154 
            155         pfactory = new DivFactory;
            156         poperation = pfactory->CreateOperation();
            157         poperation->SetNumberA(a);
            158         poperation->SetNumberB(b);
            159         try
            160         {
            161             cout << poperation->GetResult() << endl;
            162         }
            163         catch (const runtime_error& e)
            164         {
            165             cerr << e.what() << endl;
            166         }
            167         delete pfactory;
            168         delete poperation;
            169 
            170         pfactory = new PowFactory;
            171         poperation = pfactory->CreateOperation();
            172         poperation->SetNumberA(a);
            173         poperation->SetNumberB(b);
            174         cout << poperation->GetResult() << endl;
            175         delete pfactory;
            176         delete poperation;
            177     }
            178 }
            posted on 2011-04-25 15:30 unixfy 閱讀(221) 評(píng)論(0)  編輯 收藏 引用
            久久久精品日本一区二区三区| 一本色道久久88综合日韩精品 | 日本WV一本一道久久香蕉| 噜噜噜色噜噜噜久久| 国产精品天天影视久久综合网| 久久最近最新中文字幕大全| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久偷看各类wc女厕嘘嘘| 久久久久国产精品三级网| 亚洲精品乱码久久久久久中文字幕| 久久人爽人人爽人人片AV| 久久精品这里只有精99品| 久久夜色精品国产网站| 久久天天躁狠狠躁夜夜2020老熟妇| 久久婷婷五月综合97色一本一本| 国产精品综合久久第一页| 久久er99热精品一区二区| 久久无码国产专区精品| 久久精品国产WWW456C0M| 999久久久免费精品国产| 久久综合伊人77777| 久久久久夜夜夜精品国产| 日韩精品久久无码人妻中文字幕 | 伊人久久大香线焦综合四虎| 一本一本久久aa综合精品| 久久综合精品国产一区二区三区 | 久久国产精品国产自线拍免费| 99蜜桃臀久久久欧美精品网站 | 伊人色综合久久天天人守人婷| 9191精品国产免费久久| 嫩草影院久久国产精品| 久久国产成人精品麻豆| 国产99久久精品一区二区| 久久99精品国产99久久| 精品久久久噜噜噜久久久| 久久99精品久久久久久hb无码 | 四虎国产精品成人免费久久| 久久无码人妻精品一区二区三区 | 久久国产免费观看精品3| 久久99精品国产99久久| 国产成人久久久精品二区三区 |