单例(Singleton)模式 创建型模式
更新: 2023-05-24 11:11:27 字数: 0 字 时长: 0 分钟
某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
c#
// 单例模式示例
using System;
// 饿汉式单例模式
public class Singleton1
{
// 定义一个静态变量来存储类的实例
private static Singleton1 instance = new Singleton1();
// 私有化构造函数,使得外界无法创建该类实例
private Singleton1() { }
// 定义一个静态方法来获取类的实例
public static Singleton1 GetInstance()
{
return instance;
}
}
// 懒汉式单例模式
public class Singleton2
{
// 定义一个静态变量来存储类的实例
private static Singleton2 instance;
// 私有化构造函数,使得外界无法创建该类实例
private Singleton2() { }
// 定义一个静态方法来获取类的实例
public static Singleton2 GetInstance()
{
if (instance == null)
{
instance = new Singleton2();
}
return instance;
}
}
// 双重检查锁定单例模式
public class Singleton3
{
// 定义一个静态变量来存储类的实例
private static Singleton3 instance;
// 定义一个标识确保线程同步
private static readonly object locker = new object();
// 私有化构造函数,使得外界无法创建该类实例
private Singleton3() { }
// 定义一个静态方法来获取类的实例
public static Singleton3 GetInstance()
{
// 当第一个线程运行到这里时,此时会对locker对象 "加锁",
// 当第二个线程运行该方法时,首先检测locker对象为"加锁"状态,
// 该线程就会挂起等待第一个线程解锁。
// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"。
lock (locker)
{
// 如果类的实例不存在则创建,否则直接返回
if (instance == null)
{
instance = new Singleton3();
}
}
return instance;
}
}