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