单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
在我的工作过程中,我发现所有可以使用单例模式的类都有一个共性,那就是这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都是一样的,而且更重要的一点是,这个类如果有两个或者两个以上的实例的话,我的程序竟然会产生程序错误或者与现实相违背的逻辑错误。
这样的话,如果我们不将这个类控制成单例的结构,应用中就会存在很多一模一样的类实例,这会非常浪费系统的内存资源,而且容易导致错误甚至一定会产生错误,所以我们单例模式所期待的目标或者说使用它的目的,是为了尽可能的节约内存空间,减少无谓的GC消耗,并且使应用可以正常运作。
我稍微总结一下,一般一个类能否做成单例,最容易区别的地方就在于,这些类,在应用中如果有两个或者两个以上的实例会引起错误,又或者我换句话说,就是这些类,在整个应用中,同一时刻,有且只能有一种状态。
主要讲解两种单例模式,1.懒汉模式2.饿汉模式
懒汉和饿汉的区别:
懒汉:在初始化类的时候,不创建唯一的实例,而是等到真正需要用到的时候才创建。必须加上同步,否则有可能依然创建多个实例。
饿汉:在初始化的时候,就创建了唯一的实例,不管是否需要用到。不需要自己加同步,一定产生唯一的实例。
1.懒汉模式
public class Singleton { //私有化构造函数 private Singleton() { } //私有化对象 private static Singleton leton; static object obj = new object(); //接口方法 public static Singleton Instance() { //双重加锁 if (leton == null) { //解决并发 lock (obj) { if (leton == null) { return leton = new Singleton(); } } } return leton; } //方法提示 public void Result() { Console.WriteLine("懒汉模式"); } }
2.饿汉模式
public class EHan {
//私有构造函数 private EHan() { }
//创建实例 private static EHan eHan = new EHan(); public static EHan Instance() {
//返回实例 return eHan; } public void Result() { Console.Write("饿汉模式"); } }