1. 判断对象是否为NUll
A: 为什么要等待需要的时候在实例化呢,你完全可以把声明的工作放到类的全局变量中完成。这样你就可以判断这个变量是否被实例化过了没。
2. 生还是不生是自己的责任
A: 我们完全可以直接把这个类的构造方法改成私有的,外部程序就不能用new来实例化他了。
A: 但是我们可以再写一个public方法,叫做GetInstance(),这个方法的目的返回一个类实例,而此方法中,去做是否都有实例化的判断。
3. 单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
A: 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化对个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if (s1 == s2)
{
Console.WriteLine("Objects are the same instance");
}
Console.Read();
}
}
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object();
private Singleton()
{
}
public static Singleton GetInstance()
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
//public sealed class Singleton
//{
// private static readonly Singleton instance = new Singleton();
// private Singleton() { }
// public static Singleton GetInstance()
// {
// return instance;
// }
//}
A: 单例模式除了可以保证唯一的实例外,还有什么好处?
B: 单例模式因为Singleton类封装它的唯一实例,这样它可以严格控制客户怎么访问它以及何时访问它。简单的说就是对唯一实例的受控访问。
A: 实用类不保存状态,仅提供一些静态方法或静态属性让你使用,而单例类是有状态的。实用类不能用于继承多态,而单例虽然实例唯一,却是可以有子类来继承。实用类只不过是一些方法属性的集合,而单例却是有着唯一的对象的实例。
4. 双重锁定
public static Singleton GetInstance()
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance
}
5. 静态初始化
A: 由于这种静态初始化方式是在自己被加载是就将自己实例化,所有形象的称之为饿汉式单例类;要在第一次被应用时,才会将自己实例化,所有称之为懒汉式单例类。
A: 饿汉式要提前占用资源;而懒汉式又会面临着多线程访问的安全性问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。