单例模式
1 单例模式有几种说法,懒汉模式,饿汉模式;线程安全和线程不安全。
1.1 懒汉模式:是指等到调用单例方法GetInstance()的时候才去检查是否已生成对象,如果_instance为null则new一个对象,如果不为null,则直接返回_instance。这种方式的优点是你可能不会用到该实例,而只用到它的静态方法,那么这个时候内存就还没有new出来的对象,可以减少内存占用。缺点是如果多线程运行,可能会new出多个对象,属于线程不安全。
private static Singleton _instance ;
1.2 饿汉模式:是指不管你调没调用过这个类,系统在读取到该类的时候,就直接初始化new一个对象出来。缺点是没有lazy的好处(也就是懒汉模式的优点)。优点是简单,并且线程安全。
private static Singleton _instance = new Singleton();
1.3 线程安全:就是多个线程同时调用,该单例类不会产生出多个对象。可以有饿汉模式,也可以在GetInstance方法内外部加同步锁。
1.4 线程不安全: 多个线程下,该单例类可能产生出多个对象,导致违背了单例的设计目标
public class Singleton1
{
//private static Singleton1 instance ; //懒汉模式
private static Singleton1 instance = new Singleton1(); //饿汉模式
public static Singleton1 Instance
{
private set { }
get { return instance; }
}
private Singleton1() { }
public static Singleton1 GetInstance()
{
if (instance == null) //懒汉模式加这个判断
{
instance = new Singleton1();
}
return instance;
}
public void Method() { }
}
另一种单例结构:
public class Singleton<T> where T : new()
{
public static T Instance
{
get
{
if (Instance == null)
{
Instance = new T();
}
return Instance;
}
set { }
}
public Singleton()
{
if(Instance == null)
{
Instance = new T();
}
}
public T GetInstance()
{
return Instance;
}
}
public class Moon : Singleton<Moon>
{
public int Weight()
{
return 10;
}
}
public class Scientist
{
public void DoReserch()
{
int moonWeight = Moon.Instance.Weight();
var a = new Moon();
Singleton1.Instance.Method();
}
}