【设计模式】单例模式
原创
©著作权归作者所有:来自51CTO博客作者wx638ea457ad8b9的原创作品,请联系作者获取转载授权,否则将追究法律责任
前提
使用单例模式需有一下三点:
- 要有一个自己的私有类型的变量
- 要有一个私有的构造函数
- 全局访问点(static)
一、什么是单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。UML如下:
其中,Singleton类,定义了一个GetInstance操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例
1、Singleton类
class Singleton
{
private static Singleton instance;
//构造方法让其private,这就堵死了外界利用new创建此类型实例的可能
private Singleton() { }
public static Singleton GetInstance() //此方法是获得本类实例的唯一全局访问点
{
if (instance==null) //如果实例不存在,则new一个新实例,否则返回已有的实例
{
instance = new Singleton();
}
return instance;
}
}
2、客户端
static void Main(string[]args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
//比较两次实例化后对象的结果是实例相同
if (s1==s2)
{
Console.WriteLine("两个对象是相同的实例");
}
Console.Read();
}
运行上述程序,程序台输出了“两个对象是相同的实例”,这说明Singleton1和Singleton2是相同的实例,也即一个类仅有一个实例。
二、单例模式的应用
1、什么时候使用单例模式
想要控制实例数目,节省系统资源的时候
2、优点
- 内存中只有一个实例,减少了内存开支
- 避免了对资源的多重占用
3、缺点
- 没有抽象层,扩展困难
- 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化
4、使用场景
根据业务的需要来决定用不用单例模式
5、注意
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例