Singleton单例模式

1. 简介

定义

保证一个类仅有一个实例,并提供一个该实例的全局访问点。

注意

  1. 单例模型下实例化操作应该是类的设计者的责任,而不是使用者的责任。

  2. 在该类中直接提供实例化的方法,保证实例唯一

2. 示例

2.1. 最常见的单例模式

public class Singleton
{
    //保存实例容器
    private static Singleton instance = null;
    //取消默认的public的缺省构造器
    private Singleton() { }
    //实例的出口
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

2.2. 线程安全的单例模式

public class Singleton
{
    //volatile 它是被设计用来修饰被不同线程访问和修改的变量。
    //如果没有volatile,基本上会导致这样的结果:
    //要么无法编写多线程程序,要么编译器失去大量优化的机会。
    //volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
    private static volatile Singleton instance = null;

    private static object lockHelper = new object();
    //取消默认的public的构造器
    private Singleton() { }
    //实例的出口
    public static Singleton Instance
    {
        get
        {
            //double check 前面的判断是为了减少后面判断的访问,因为后面的判断会阻塞并发线程
            if (instance == null)
            {
                lock (lockHelper)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

2.3. 线程安全且简练的单例模式

利用了静态构造方法是线程安全的。

缺点: 不接受参数

public class Singleton
{
    public static readonly Singleton Instance = new Singleton();
    private Singleton() { }
}

等价于

public class Singleton
{
    public static readonly Singleton Instance;
    static Singleton()
    {
        Instance = new Singleton();
    }
    private Singleton() { }
}

说明:

  1. 静态构造器执行时间:在静态字段初始化之前执行。

  2. 内联初始化编译后会将初始化的内容放到静态构造器内部执行

  3. 静态构造器只能被一个线程执行一次,不可能被多线程执行

2.4. 含参数的单例模式

一般情况下用不到。

public class Singleton
{
    //保存实例容器
    private static Singleton instance;
    //取消默认的public的构造器
    private Singleton(int x,int y)
    {
        this.x = x;
        this.y = y;
    }
    //实例的出口
    public static Singleton GetInstance(int x, int y)
    {
        if (instance == null)
        {
            instance = new Singleton(x,y);
        }
        else
        {
            instance.x = x;
            instance.y = y;
        }
        return instance;
    }
    private int x;
    private int y;
}
(0)

相关推荐

  • 23种设计模式入门 -- 单例模式

    单例模式:采用一定的方法,使得软件运行中,对于某个类只能存在一个实例对象,并且该类只能提供一个取得实例的方法. 分类: 饿汉式 静态常量方式 静态代码块方式 懒汉式 普通方式,线程不安全 同步方法方式 ...

  • 设计模式(2) 单例模式

    单例模式 线程安全的Singleton 会破坏Singleton的情况 线程级Singleton 单例模式是几个创建型模式中最独立的一个,它的主要目标不是根据客户程序调用生成一个新的实例,而是控制某个 ...

  • 单例模式的实现

    记一下学习单例模式的笔记: 单例就是要保证该类仅有一个实例.实现完全封闭的单例(外部不能new)其实就要两点要求: 全局访问:需要一个该类型的全局静态变量,每次获取实例时都要判断它是否null,不存在 ...

  • 设计模式之单例模式(Singleton Pattern)

    一.定义 一个类只有一个实例,且该类能自行创建这个实例的一种模式. 二.单例模式举例 例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各 ...

  • 【1/25】将Game改写为单例模式(Singleton Pattern)

    这是<小游戏从0到1设计模式重构>系列内容第1篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. Game的实例在游戏时只有一个 ...

  • Python单例模式(Singleton)的N种实现

    很多初学者喜欢用全局变量,因为这比函数的参数传来传去更容易让人理解.确实在很多场景下用全局变量很方便.不过如果代码规模增大,并且有多个文件的时候,全局变量就会变得比较混乱.你可能不知道在哪个文件中定义 ...

  • 【设计模式】单例模式(Singleton Pattern)

    懒汉式 public class Singleton { private static Singleton instance; private Singleton() {}; public stati ...

  • 【转】C#设计模式-单例模式(Singleton Pattern)

    目录 介绍 第一个版本 --不是线程安全的 第二个版本 -- 简单的线程安全 第三个版本 - 使用双重检查锁定尝试线程安全 第四个版本 - 不太懒,不使用锁且线程安全 第五版 - 完全懒惰的实例化 第 ...

  • 设计模式之单例模式(Singleton Pattern),太简单了

    基本定义 单例模式就是确保某一个类只有一个实例,并且提供一个全局访问点.单例模式有如下几个特点: 它只有一个实例. 它必须要自行实例化. 它必须自行向整个系统提供访问点. 代码实现 饿汉式 直接初始化 ...

  • 设计模式 | 单例模式(singleton)

    定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 结构:(书中图,侵删) 结构超简单.就在你想控制实例数的类上操作即可. 1.定义一个static的对象引用 2.私有化构造方法 3.提供 ...

  • Qt中实现单例模式(SingleTon)

    单例模式分为"饥汉"和"饿汉"两种版本,也正是线程安全问题使得原本简单的单例模式变得复杂.由于单例模式很常用,Boost库中有强大的泛型单例实现,我也利用Qt的 ...

  • 单例模式

    什么是Singleton? 单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式. 例如:代表JVM运行环境的Runtime类. 要点 一是某个类只能有一个实例 构造器私有化 ...