Skip to content

单例(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;
    }
}
你觉得这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度