⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 factory.h

📁 游戏框架
💻 H
字号:
#ifndef FACTORY_HEAD_FILE
#define FACTORY_HEAD_FILE

#pragma once

#include "Array.h"

//////////////////////////////////////////////////////////////////////////

//宏定义
#define INFINITY_COUNT				-1									//无限数目

//类对象工厂
template <class TYPE> class CFactoryTemplate
{
	//类说明
	typedef CArrayTemplate<TYPE *> CItemPtrArray;

	//变量定义
protected:
	INT_PTR							m_nMaxCount;						//最大数目
	CItemPtrArray					m_FreeItem;							//空闲对象
	CItemPtrArray					m_ActiveItem;						//活动对象
	CItemPtrArray					m_StorageItem;						//存储对象

	//函数定义
public:
	//构造函数
	CFactoryTemplate(void);
	//析构函数
	virtual ~CFactoryTemplate(void);

	//信息函数
public:
	//最大数目
	INT_PTR GetMaxCount();
	//空闲数目
	INT_PTR GetFreeCount();
	//活动数目
	INT_PTR GetActiveCount();
	//存储数目
	INT_PTR GetStorageCount();
	//枚举对象
	TYPE * EnumActiveObject(INT_PTR nIndex);
	//枚举对象
	TYPE * EnumStorageObject(INT_PTR nIndex);

	//复制函数
public:
	//复制空闲
	void CopyFreeItem(CItemPtrArray & ItemPtrArray);
	//复制活动
	void CopyActiveItem(CItemPtrArray & ItemPtrArray);
	//复制存储
	void CopyStorageItem(CItemPtrArray & ItemPtrArray);

	//管理函数
public:
	//创建对象
	TYPE * ActiveItem();
	//删除对象
	bool FreeItem(TYPE * pObject);
	//删除所有
	void FreeAllItem();
	//释放内存
	void FreeExtra();
	//设置数目
	void SetMaxCount(INT_PTR nMaxCount=INFINITY_COUNT);
};

//////////////////////////////////////////////////////////////////////////
// CFactoryTemplate<TYPE> 内联函数

//最大数目
template<class TYPE> _inline INT_PTR CFactoryTemplate<TYPE>::GetMaxCount()
{
	return m_nMaxCount;
}

//空闲数目
template<class TYPE> _inline INT_PTR CFactoryTemplate<TYPE>::GetFreeCount()
{
	return m_FreeItem.GetCount();
}

//活动数目
template<class TYPE> _inline INT_PTR CFactoryTemplate<TYPE>::GetActiveCount()
{
	return m_ActiveItem.GetCount();
}

//存储数目
template<class TYPE> _inline INT_PTR CFactoryTemplate<TYPE>::GetStorageCount()
{
	return m_StorageItem.GetCount();
}

//设置数目
template<class TYPE> _inline void CFactoryTemplate<TYPE>::SetMaxCount(INT_PTR nMaxCount)
{
	m_nMaxCount=nMaxCount;
}

//复制空闲
template<class TYPE> _inline void CFactoryTemplate<TYPE>::CopyFreeItem(CItemPtrArray & ItemPtrArray)
{
	ItemPtrArray.Copy(m_FreeItem);
	return;
}

//复制活动
template<class TYPE> _inline void CFactoryTemplate<TYPE>::CopyActiveItem(CItemPtrArray & ItemPtrArray)
{
	ItemPtrArray.Copy(m_ActiveItem);
	return;
}

//复制存储
template<class TYPE> _inline void CFactoryTemplate<TYPE>::CopyStorageItem(CItemPtrArray & ItemPtrArray)
{
	ItemPtrArray.Copy(m_StorageItem);
	return;
}

//////////////////////////////////////////////////////////////////////////
// CFactoryTemplate<TYPE> 外联函数

//构造函数
template<class TYPE> CFactoryTemplate<TYPE>::CFactoryTemplate()
{
	m_nMaxCount=INFINITY_COUNT;
	return;
}

//析构函数
template<class TYPE> CFactoryTemplate<TYPE>::~CFactoryTemplate()
{
	//清理对象
	TYPE * pObject=NULL;
	for (INT_PTR i=0;i<m_StorageItem.GetCount();i++)
	{
		pObject=m_StorageItem[i];
		ASSERT(pObject!=NULL);
		SafeDelete(pObject);
	}
	m_FreeItem.RemoveAll();
	m_ActiveItem.RemoveAll();
	m_StorageItem.RemoveAll();

	return;
}

//创建对象
template<class TYPE> TYPE * CFactoryTemplate<TYPE>::ActiveItem()
{
	//获取空闲对象
	TYPE * pObject=NULL;
	if (m_FreeItem.GetCount()>0)
	{
		//返回最后一个空闲块的指针引用,并从空闲列表中移除
		INT_PTR nItemPostion=m_FreeItem.GetCount()-1;
		pObject=m_FreeItem[nItemPostion];
		ASSERT(pObject!=NULL);
		m_FreeItem.RemoveAt(nItemPostion);
		m_ActiveItem.Add(pObject);
	}

	//创建新对象
	if (pObject==NULL)
	{
		if ((m_nMaxCount==INFINITY_COUNT)||(m_StorageItem.GetCount()<m_nMaxCount))
		{
			try
			{
				pObject=new TYPE;
				if (pObject==NULL) return NULL;
				m_StorageItem.Add(pObject);
				m_ActiveItem.Add(pObject);
			}
			catch (...) { return NULL; }
		}
	}

	return pObject;
}

//删除所有活动元素(回收至空闲列表中)
template<class TYPE> void CFactoryTemplate<TYPE>::FreeAllItem()
{
	m_FreeItem.Append(m_ActiveItem);
	m_ActiveItem.RemoveAll();
	return;
}

//释放内存
template<class TYPE> void CFactoryTemplate<TYPE>::FreeExtra()
{
	TYPE * pObject=NULL;
	for (INT_PTR i=0;i<m_StorageItem.GetCount();i++)
	{
		pObject=m_StorageItem[i];
		ASSERT(pObject!=NULL);
		delete pObject;
	}
	m_StorageItem.RemoveAll();

	return;
}

//删除对象
template<class TYPE> bool CFactoryTemplate<TYPE>::FreeItem(TYPE * pObject)
{
	//效验参数
	ASSERT(pObject!=NULL);

	//释放对象
	INT_PTR nActiveCount=m_ActiveItem.GetCount();
	for (INT_PTR i=0;i<nActiveCount;i++)
	{
		if (pObject==m_ActiveItem[i])
		{
			// 回收对象
			m_ActiveItem.RemoveAt(i);
			m_FreeItem.Add(pObject);
			return true;
		}
	}

	//删除失败
	ASSERT(FALSE);
	return false;
}

//枚举活动元素列表中的对象
template<class TYPE> TYPE * CFactoryTemplate<TYPE>::EnumActiveObject(INT_PTR nIndex)
{
	//效验参数
	ASSERT(nIndex>=0);
	if (nIndex<0) return NULL;

	//获取对象
	if (nIndex<m_ActiveItem.GetCount())
	{
		TYPE * pObject=m_ActiveItem[nIndex];
		ASSERT(pObject!=NULL);
		return pObject;
	}

	return NULL;
}

//枚举存储列表中的元素对象
template<class TYPE> TYPE * CFactoryTemplate<TYPE>::EnumStorageObject(INT_PTR nIndex)
{
	//效验参数
	ASSERT(nIndex>=0);
	if (nIndex<0) return NULL;

	//获取对象
	if (nIndex<m_StorageItem.GetCount())
	{
		TYPE * pObject=m_StorageItem[nIndex];
		ASSERT(pObject!=NULL);
		return pObject;
	}

	return NULL;
}

//////////////////////////////////////////////////////////////////////////

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -