工厂模式
作用:
- 将创建对象变成【统一】、【可管理】的过程。
- 通过工厂模式可以实现对象的【单例】,避免重复创建对象。
思想:
- 【核心思想】是通过调用工厂类,传递对象参数,实现一个工厂类创建所有需要的对象。
- 创建一个工厂类,实现参数化创建对象。
- 放弃使用“new”来创建对象,改用工厂类的方法统一创建对象。
工厂模式代码
工厂类
class GameObjectFactory
{
public static GameObject Create(gameObjectEnum gameObjectEnum)
{
//创建一个父类对象,用来存储子类实例
GameObject go = new GameObject();
//判断需要创建的子类对象
switch (gameObjectEnum)
{
case gameObjectEnum.Bullet:
go = new Bullet();
break;
case gameObjectEnum.Enemy:
go = new Enemy();
break;
}
//返回对象
return go;
}
}
游戏对象
class GameObject
{
public Vector3 position;
//构造函数
public GameObject()
{
//创建坐标对象
position = new Vector3();
}
}
class Bullet : GameObject
{
}
class Enemy : GameObject
{
}
public enum gameObjectEnum
{
Bullet,
Enemy
}
class Vector3
{
public float x;
public float y;
public float z;
}
主函数
class Program
{
static void Main(string[] args)
{
//调用工厂类来创建需要要的对象
GameObject bullet = GameObjectFactory.Create(gameObjectEnum.Bullet);
}
}
对象池(工厂模式的应用例子)
作用: 可以【重复利用】对象实例,从而减少内存的浪费,还可以【优化】运行速度。
思想:
- 使用栈式集合Stack<>(对象池)存储对象实例;
- 当需要用到对象时,从集合中弹出对象实例,直接使用;
- 集合中的对象使用完,在考虑创建对象;
- 使用完后的对象实例,重新放入集合中,等待下次使用;
- 这样可以做到严格限制对象个数;
对象池代码
工厂类
class GameObjectFactory
{
//创建栈式集合Stack
private static Stack<Bullet> bulletStack = new Stack<Bullet>();
//子弹创建方法
public static Bullet CreateBullet()
{
Bullet bullet;
if (bulletStack.Count > 0)
{
//弹出集合第一个元素,并返回
bullet = bulletStack.Pop();
}
else
{
bullet = new Bullet();
}
return bullet;
}
//销毁无用的子弹
public static void Destory(Bullet bullet)
{
//把子弹入栈,并隐藏子弹,就当做是销毁了
bulletStack.Push(bullet);
}
}
子弹对象
class GameObject
{
public Vector3 position;
//构造函数
public GameObject()
{
//创建坐标对象
position = new Vector3();
}
}
class Bullet : GameObject
{
public void Deatory()
{
GameObjectFactory.Destory(this);
}
}
class Vector3
{
public float x;
public float y;
public float z;
}
主函数
class Program
{
static void Main(string[] args)
{
//调用工厂类创建子弹对象
Bullet bullet = GameObjectFactory.CreateBullet();
//销毁子弹对象(把子弹放入栈集合中,隐藏起来)
bullet.Deatory();
}
}