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