天天看點

學習筆記——工廠模式Factory - 阿嗚的邊城

學習筆記——工廠模式Factory

學習筆記——工廠模式Factory - 阿嗚的邊城

Product是我們所需要獲得的對象,一般的使用中,我們直接通過new獲得新對象。

當需要大量獲得對象時,每一次都new會很麻煩。

《真菌世界》遊戲中,一個星球上有很多樹,一棵樹會不斷生成真菌。星球是場景,樹就是工廠,真菌就是産品。場景不用關心如何生成一種特定類型的真菌,真菌的屬性由生産它的工廠負責就行了。

簡單代碼示例:

C++示例

BaseFungus.h

1 #pragma once
2 class CBaseFungus
3 {
4 public:
5     CBaseFungus(void);
6     ~CBaseFungus(void);
7 public:
8     virtual void Fight();
9 };      

BaseFungus.cpp

1 #include "BaseFungus.h"
 2 #include <iostream>
 3 
 4 
 5 CBaseFungus::CBaseFungus(void)
 6 {
 7 }
 8 
 9 
10 CBaseFungus::~CBaseFungus(void)
11 {
12 }
13 
14 void CBaseFungus::Fight()
15 {
16     std::cout<<"Base fungus fight"<<std::endl;
17 }      

Fungus.h

1 #pragma once
 2 #include "basefungus.h"
 3 class CFungus :
 4     public CBaseFungus
 5 {
 6 public:
 7     CFungus(void);
 8     ~CFungus(void);
 9 public:
10     void Fight();
11 };      

Fungus.cpp

1 #include "Fungus.h"
 2 #include <iostream>
 3 
 4 
 5 CFungus::CFungus(void)
 6 {
 7 }
 8 
 9 
10 CFungus::~CFungus(void)
11 {
12 }
13 
14 void CFungus::Fight()
15 {
16     std::cout<<"Fungus fight"<<std::endl;
17 }      

Tree.h

1 #pragma once
 2 #include "BaseFungus.h"
 3 
 4 class CTree
 5 {
 6 public:
 7     CTree(void);
 8     ~CTree(void);
 9 public:
10     CBaseFungus* GetFungus();
11 };      

Tree.cpp

1 #include "Tree.h"
 2 #include "Fungus.h"
 3 
 4 
 5 CTree::CTree(void)
 6 {
 7 }
 8 
 9 
10 CTree::~CTree(void)
11 {
12 }
13 
14 CBaseFungus* CTree::GetFungus()
15 {
16     return new CFungus();
17 }      

main.cpp

1 #include <iostream>
 2 #include "Tree.h"
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     CTree* pTree = new CTree();
 8     CBaseFungus* pFungus = pTree->GetFungus();
 9 
10     pFungus->Fight();
11 
12     delete pFungus;
13     delete pTree;
14 
15     return 0;
16 }      

C#示例

CBaseFungus.cs

1 namespace Factory
 2 {
 3     class CBaseFungus
 4     {
 5         public CBaseFungus()
 6         {
 7 
 8         }
 9 
10         public virtual void Fight()
11         {
12             Console.WriteLine("Base fungus fight");
13         }
14     }
15 }      

CFungus.cs

1 namespace Factory
 2 {
 3     class CFungus: CBaseFungus
 4     {
 5         public CFungus()
 6         {
 7         }
 8 
 9         public override void Fight()
10         {
11             Console.WriteLine("Fungus fight");
12         }
13     }
14 }      

CTree.cs

1 namespace Factory
 2 {
 3     class CTree
 4     {
 5         public CTree()
 6         {
 7 
 8         }
 9 
10         public CFungus GetFungus()
11         {
12             return new CFungus();
13         }
14     }
15 }      

Program.cs

1 namespace Factory
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             CTree tree = new CTree();
 8             CFungus fungus = tree.GetFungus();
 9             fungus.Fight();
10         }
11     }
12 }      

1.如果一棵樹可以生成不同的真菌,那麼可以直接在建立方法中增加傳遞參數,通過參數來判斷生成哪種真菌,也可以不同的真菌使用不同的函數來産生(2)。

2.如果一棵樹現在生産的是真菌飛機,樹更新後可以生産另一類真菌炮。目前的接口僅為真菌飛機服務的,新增的真菌炮如何生産?我們可以為樹增加生産真菌炮的接口,然後在這個接口中專門生産真菌炮。

3.如果真菌飛機類型A1、A2,真菌炮類型B1、B2,不同的樹T1、T2可以按不同的組合來生産,如何操作?這個時候采用抽象工廠模式,不同的樹有着共同的接口,具體實作中,按各自的組合來分别實作接口。