题目:设计一个类,我们只能生成该类的一个实例。
本题考点:对单例模式的理解,对多线程编程理解。
(1)不好的解法一:只适用于单线程环境
(2)不好的解法二:虽然在多线程环境中能工作但效率不高
缺点——加锁耗时
(3)可行的解法三:加同步锁前后两次判断实例是否已存在
缺点——代码比较复杂,容易出错。
(4)强烈推荐的解法一:利用静态构造函数
缺点——会过早地创建实例,降低内存的使用效率。
(5)强烈推荐的解法二:实现按需创建实例
完整代码(C#,看看即可)——
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Singleton
{
public sealed class Singleton1
{
private Singleton1()
{
}
private static Singleton1 instance = null;
public static Singleton1 Instance
{
get
{
if (instance == null)
instance = new Singleton1();
return instance;
}
}
}
public sealed class Singleton2
{
private Singleton2()
{
}
private static readonly object syncObj = new object();
private static Singleton2 instance = null;
public static Singleton2 Instance
{
get
{
lock (syncObj)
{
if (instance == null)
instance = new Singleton2();
}
return instance;
}
}
}
public sealed class Singleton3
{
private Singleton3()
{
}
private static object syncObj = new object();
private static Singleton3 instance = null;
public static Singleton3 Instance
{
get
{
if (instance == null)
{
lock (syncObj)
{
if (instance == null)
instance = new Singleton3();
}
}
return instance;
}
}
}
public sealed class Singleton4
{
private Singleton4()
{
}
public static void Print()
{
Console.WriteLine("Singleton4 Print");
}
private static Singleton4 instance = new Singleton4();
public static Singleton4 Instance
{
get
{
return instance;
}
}
}
public sealed class Singleton5
{
Singleton5()
{
}
public static void Print()
{
Console.WriteLine("Singleton5 Print");
}
public static Singleton5 Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
static Nested()
{
}
internal static readonly Singleton5 instance = new Singleton5();
}
}
class Program
{
static void Main(string[] args)
{
Singleton4.Print();
Singleton5.Print();
}
}
}