为什么使用单例模式
很多时候,我们希望一个类只能创建一个对象,以此作为某种“管理器”对全局的属性进行管理。这个时候我们就需要使用单例模式来确保此类只能生成一个对象。
为啥不用静态类代替
静态类和单例类不同,单例模式的灵活性更高,方法可以被override,因为静态类都是静态方法,所以不能被override。
而且,静态类仅仅是工具包的存在,同时不能使用多态继承的面向对象特性。如果你希望维护状态信息,或者访问资源时,应该选用单例模式。如果仅希望使用固定写好的工具方法,则直接用静态类好了。
单例模式是什么
单例模式能够使类只能创建一个对象,在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存。
怎么实现一个简单的单例类
我们假定一个需求:
制作一个怪物管理器,提供创建怪物,移除怪物的方法。每个怪物都有自己的唯一ID。
那么我们就可以将这个怪物管理器设置成为一个单例类,对游戏场景内的所有怪物进行管理:
class MonsterManager
{
private static MonsterManager instance = new MonsterManager();
private Hashtable hashtable = new Hashtable();
private MonsterManager()
{
}
public static MonsterManager Instance
{
get
{
return instance;
}
}
public void CreateMonster(int id,string name)
{
Monster monster = new Monster(id, name);
hashtable.Add(id, monster);
Console.WriteLine("已创建名称为{0}的怪物,id为{1}", name, id);
}
public void RemoveMonster(int id)
{
Monster monster = hashtable[id] as Monster;
Console.WriteLine("已删除id为{0},名称为{1}的怪物",monster.name , id);
hashtable.Remove(id);
}
}
分析此代码,其单例模式的实现为以下原理:
1. 成员变量:一个私有的静态自己的类对象,一般命名为instance。
2. 属性构造器:一个公开的访问构造器,仅提供获取instance属性的get方法。
3. 空参数构造函数:一个私有的空参数构造函数,意在断绝外界直接使用默认构造函数创建该类对象。
以上三个因素相互限制,就形成了单例模式。