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