题目:设计一个类,我们只能生成该类的一个实例。
属于是设计模式之类的面试题了
可以学习下大话设计模式:
https://blog.youkuaiyun.com/Ejzq1/article/details/125111181?spm=1001.2014.3001.5501
C# 代码逐行注释讲解:
using System;
namespace _02_Singleton
{
//解法一:只能
public sealed class Singleton1 //sealed类不能被继承或重写
{
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;
}
}
}
//解法四:静态变量只在第一次用到Singleton4初始化,过早创建实例
public sealed class Singleton4
{
private Singleton4()
{
Console.WriteLine("An instance of Singleton4 is created.");
}
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()
{
Console.WriteLine("An instance of Singleton5 is created.");
}
public static void Print()
{
Console.WriteLine("Singleton5 Print");
}
public static Singleton5 Instance
{
get //让用到Singleton但是没用到Instance的地方不用去实例化
{
return Nested.instance;
}
}
class Nested
{
static Nested()
{
}
internal static readonly Singleton5 instance = new Singleton5();
}
}
class Program
{
static void Main(string[] args)
{
// 也会打印An instance of Singleton4 is created.
Singleton4.Print();
// 不会打印An instance of Singleton5 is created.
Singleton5.Print();
}
}
}