dev2007

学习笔记——工厂模式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可以按不同的组合来生产,如何操作?这个时候采用抽象工厂模式,不同的树有着共同的接口,具体实现中,按各自的组合来分别实现接口。

 

分类:

技术点:

相关文章: