C++------簡單工廠模式,工廠方法模式和抽象工廠模式


1,設計模式

  設計模式是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟件開發人員經過相當長的一段時間的試驗和錯誤總結出來的。

2.設計模式原則

  1)開閉原則(Open Close Principle)

    開閉原則的意思是:對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼。

  2里氏代換原則(Liskov Substitution Principle)

    里氏代換原則是面向對象設計的基本原則之一。 里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。LS里氏代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化,而基類與子類的繼承關系就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規范。

  3依賴倒轉原則(Dependence Inversion Principle)

    這個原則是開閉原則的基礎,具體內容:針對接口編程,依賴於抽象而不依賴於具體。

  4接口隔離原則(Interface Segregation Principle)

    使用多個隔離的接口,比使用單個接口要好。它還有另外一個意思是:降低類之間的耦合度。由此可見,其實設計模式就是從大型軟件架構出發、便於升級和維護的軟件設計思想,它強調降低依賴,降低耦合。

  5迪米特法則,又稱最少知道原則(Demeter Principle)

    最少知道原則是指:一個實體應當盡量少地與其他實體之間發生相互作用,使得系統功能模塊相對獨立。

  6合成復用原則(Composite Reuse Principle)

    合成復用原則是指:盡量使用合成/聚合的方式,而不是使用繼承。.

3.簡單工廠模式

  簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。

  例如:

    有一家生產處理核的廠家,它只有一個工廠,能夠生產兩種型號的處理器核。客戶需要什么樣的處理器,一定要顯示地告訴生產工廠。

  代碼如下:

 1             #include <iostream>
 2             using namespace std;
 3             enum CTYPE {COREA,COREB};
 4             class SingleCore
 5             {
 6             public:
 7                     virtual void Show() = 0;
 8             };
 9 
10             class SingleCoreA:public SingleCore
11             {
12 
13             public:
14                 void Show()
15                 {
16                     cout << "Single Core A" << endl;
17                 }
18             };
19             class SingleCoreB:public SingleCore
20             {
21             public:
22                 void Show()
23                 {
24                     cout << "Single Core B" << endl;
25                 }
26             };
27             class Factory
28 
29             {
30             public:
31                 SingleCore* CreateSingleCore(enum CTYPE c)
32                 {
33                     if(c == COREA)
34                     {
35                         cout << "Create Single Core A" << endl;
36                         return new SingleCoreA;
37                     }
38                     else if(c == COREB)
39                     {
40                         cout << "Create Single Core B" << endl;
41                         return new SingleCoreB;
42                     }
43                     else
44                     
45                         cout << "Don't have this Core" << endl;
46                         return NULL;
47                     }
48                 }
49             };
50 
51             int main()
52             {
53                     Factory m;
54                     SingleCore* p = m.CreateSingleCore(COREA);
55                     p->Show();
56                     p = m.CreateSingleCore(COREB);
57                     p->Show();
58             }     

  缺點:

    就是當需要增加新的處理器核類型式,需要修改工廠類,違反了開放封閉原則:可擴展,但不可修改。

4.工廠方法模式:

  是指定義一個用於創建對象的接口,讓子類決定實例化哪個類。將創建過程延遲到子類進行。

  例如:

  生產處理器的廠家,決定再開設一個工廠專門用來生產B型號的單核,一個工廠用來生產A型號的單核。這時客戶要A型號的核,就找A工廠要;B型號的,找B工廠要;

  代碼如下:

 1             #include <iostream>
 2             using namespace std;
 3             class SingleCore
 4             {
 5             public:
 6                 virtual void Show() = 0;
 7             };
 8             class SingleCoreA:public SingleCore
 9             {
10             public:
11                 void Show()
12                 {
13                     cout << "Single Core A" << endl;
14                 }
15             };
16             class SingleCoreB:public SingleCore
17             {
18             public:
19                 void Show()
20                 {
21                     cout << "Single Core B" << endl;
22                 }
23             };
24             class Factory
25             {
26             public:
27                 virtual SingleCore* CreateSingleCore() = 0;
28             };
29             class FactoryA:public Factory
30             {
31             public:
32                 SingleCore* CreateSingleCore()
33                 {
34                     cout << "Create SingleCore A" << endl;
35                     return new SingleCoreA();
36                 }
37             };
38             class FactoryB:public Factory
39             {
40             public:
41                 SingleCore* CreateSingleCore()
42                 {
43                     cout << "Create SingleCore B" << endl;
44                     return new SingleCoreB();
45                 }
46             };
47             int main()
48             {
49                 FactoryA m;
50                 SingleCore* p = m.CreateSingleCore();
51                 p->Show();
52                 FactoryB n;
53                 p = n.CreateSingleCore();
54                 p->Show();
55             }    

  缺點:

    每增加一個新產品就需要,增加一個對象的工廠。

5.抽象工廠模式:

  是指定義一個創建一些列相關或相互依賴的對象接口,而無需指定它們具體的類。

  例如:

    這家公司的技術不斷發展,現在可以生產多核的處理器,具體方法:還是開設兩個工廠分別用來生產A,B兩種型號的處理器。
  代碼如下:

  1             #include <iostream>
  2             using namespace std;
  3             class SingleCore
  4             {
  5             public:
  6                 virtual void Show() = 0;
  7             };
  8             class SingleCoreA:public SingleCore
  9             {
 10             public:
 11                 void Show()
 12                 {
 13                     cout << " SingleCoreA"<<endl;
 14                 }
 15             };
 16             class SingleCoreB:public SingleCore
 17 
 18             {
 19             public:
 20                 void Show()
 21                 {
 22                     cout << " SingleCoreA"<<endl;
 23                 }
 24             };
 25             class SingleCoreB:public SingleCore
 26             {
 27             public:
 28                 void Show()
 29                 {
 30                     cout << "SingleCoreB" << endl;
 31                 }
 32             };
 33 
 34             class MultiCore
 35             {
 36             public:
 37                 virtual void Show() = 0;
 38             };
 39             class MultiCoreA:public MultiCore
 40             {
 41             public:
 42                 void Show()
 43                 {
 44                     cout << "MultiCoreA" << endl;
 45                 }
 46             };
 47             class MultiCoreB:public MultiCore
 48             {
 49             public:
 50                 void Show()
 51                 {
 52                     cout << "MultiCoreB" << endl;
 53                 }
 54             };
 55             class CoreFactory
 56             {
 57             public:
 58                 virtual SingleCore* createSingleCore() = 0;
 59                 virtual MultiCore* createMultiCore() = 0;
 60             };
 61 
 62             class CoreFactoryA:public CoreFactory
 63             {
 64             public:
 65                 SingleCore* createSingleCore()
 66                 {
 67                     cout << "create SingleCoreA" << endl;
 68                     return new SingleCoreA();
 69                 }
 70                 MultiCore* createMultiCore()
 71                 {
 72                     cout << "create MultiCoreA" << endl;
 73                     return new MultiCoreA();
 74 
 75                 }
 76             };
 77             class CoreFactoryB:public CoreFactory
 78             {
 79             public:
 80                 SingleCore* createSingleCore()
 81                 {
 82                     cout << "create SingleCoreB" << endl;
 83                     return new SingleCoreB();
 84                 }
 85                 MultiCore* createMultiCore()
 86                 {
 87                     cout << "create MultiCoreB" << endl;
 88                     return new MultiCoreB();
 89                 }
 90             };
 91 
 92             int main()
 93             {
 94                 CoreFactoryB Fcb;
 95                 SingleCore* core = Fcb.createSingleCore();
 96                 MultiCore* Mcore = Fcb.createMultiCore();
 97                 core->Show();
 98                 Mcore->Show();
 99                 CoreFactoryA Fca;
100                 core = Fca.createSingleCore();
101                 Mcore = Fca.createMultiCore();
102                 core->Show();
103                 Mcore->Show();
104             }        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM