Product是我们所需要获得的对象,一般的使用中,我们直接通过new获得新对象。

当需要大量获得对象时,每一次都new会很麻烦。

《真菌世界》游戏中,一个星球上有很多树,一棵树会不断生成真菌。星球是场景,树就是工厂,真菌就是产品。场景不用关心如何生成一种特定类型的真菌,真菌的属性由生产它的工厂负责就行了。

简单代码示例:

C++示例

BaseFungus.h

 #pragma once
class CBaseFungus
{
public:
CBaseFungus(void);
~CBaseFungus(void);
public:
virtual void Fight();
};

BaseFungus.cpp

 #include "BaseFungus.h"
#include <iostream> CBaseFungus::CBaseFungus(void)
{
} CBaseFungus::~CBaseFungus(void)
{
} void CBaseFungus::Fight()
{
std::cout<<"Base fungus fight"<<std::endl;
}

Fungus.h

 #pragma once
#include "basefungus.h"
class CFungus :
public CBaseFungus
{
public:
CFungus(void);
~CFungus(void);
public:
void Fight();
};

Fungus.cpp

 #include "Fungus.h"
#include <iostream> CFungus::CFungus(void)
{
} CFungus::~CFungus(void)
{
} void CFungus::Fight()
{
std::cout<<"Fungus fight"<<std::endl;
}

Tree.h

 #pragma once
#include "BaseFungus.h" class CTree
{
public:
CTree(void);
~CTree(void);
public:
CBaseFungus* GetFungus();
};

Tree.cpp

 #include "Tree.h"
#include "Fungus.h" CTree::CTree(void)
{
} CTree::~CTree(void)
{
} CBaseFungus* CTree::GetFungus()
{
return new CFungus();
}

main.cpp

 #include <iostream>
#include "Tree.h"
using namespace std; int main()
{
CTree* pTree = new CTree();
CBaseFungus* pFungus = pTree->GetFungus(); pFungus->Fight(); delete pFungus;
delete pTree; return ;
}

C#示例

CBaseFungus.cs

 namespace Factory
{
class CBaseFungus
{
public CBaseFungus()
{ } public virtual void Fight()
{
Console.WriteLine("Base fungus fight");
}
}
}

CFungus.cs

 namespace Factory
{
class CFungus: CBaseFungus
{
public CFungus()
{
} public override void Fight()
{
Console.WriteLine("Fungus fight");
}
}
}

CTree.cs

 namespace Factory
{
class CTree
{
public CTree()
{ } public CFungus GetFungus()
{
return new CFungus();
}
}
}

Program.cs

 namespace Factory
{
class Program
{
static void Main(string[] args)
{
CTree tree = new CTree();
CFungus fungus = tree.GetFungus();
fungus.Fight();
}
}
}

1.如果一棵树可以生成不同的真菌,那么可以直接在创建方法中增加传递参数,通过参数来判断生成哪种真菌,也可以不同的真菌使用不同的函数来产生(2)。

2.如果一棵树现在生产的是真菌飞机,树升级后可以生产另一类真菌炮。目前的接口仅为真菌飞机服务的,新增的真菌炮如何生产?我们可以为树增加生产真菌炮的接口,然后在这个接口中专门生产真菌炮。

3.如果真菌飞机类型A1、A2,真菌炮类型B1、B2,不同的树T1、T2可以按不同的组合来生产,如何操作?这个时候采用抽象工厂模式,不同的树有着共同的接口,具体实现中,按各自的组合来分别实现接口。

最新文章

  1. C#组件系列——又一款Excel处理神器Spire.XLS,你值得拥有(二)
  2. SQL高级查询——50句查询(含答案) ---参考别人的,感觉很好就记录下来留着自己看。
  3. ARM-ContexM3/4组优先级和子优先级抢占规则
  4. http的header参数有关
  5. 通过宏定义判断是否引入的是framework,反之则使用双引号,实用!
  6. [复变函数]第10堂课 3.2 Cauchy 积分定理
  7. 关于mediacontroller的一些好的文章
  8. Face++云相册应用IOS源码
  9. Android 类似时间轴的实现
  10. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇07:全屏炸弹》
  11. JavaScript入门介绍(二)
  12. 话付通SDK 聚合支付
  13. HBase 4、Phoenix安装和Squirrel安装
  14. 在Windows上安装MongoDB
  15. json-java处理-jackson
  16. 使用storyboard设置button边框属性(颜色,宽度,圆角)
  17. windows下复制文件报错“文件名对目标文件夹可能过长 。您可以缩短文件名并重试,或者......”
  18. ios 适配iOS11&amp;iPhoneX的一些坑
  19. [Ting&#39;s笔记Day5]在部署到Heroku之前,将Rails项目从SQLite设定为PostgreSQL
  20. python 正则基本方法

热门文章

  1. WTL 设置 SDI 主窗口初始大小的方法
  2. java的静态方法的使用
  3. (╭ ̄3 ̄)╭ 小希的迷宫II
  4. MySQL复制表结构,表数据。
  5. chrome浏览器debug
  6. 安装Eclipse环境
  7. GITLAB管理自己的私有源码
  8. js如何在指定页面跳转到另一指定页面
  9. java对象和json对象之间互相转换
  10. R语言笔记2--循环、R脚本