C#单例类的实现

C#单例类的实现

单例类保证一个类全局仅有一个实例,并提供一个全局访问点,由于只能生成一个实例,因此我们必须把构造函数设为私有函数以禁止他人创建实例。

实现1:懒汉式,线程不安全

该实现没有额外开销,不要求线程安全的情况下可以使用:

public class Singleton1
{
    private static Singleton1 instance = null;
    private Singleton1() { }

    public static Singleton1 Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton1();
            }
            return instance;
        }
    }
}

实现2:懒汉式,线程安全

由于每次访问单例类实例都会加锁,而加锁是一个非常耗时的操作,故不推荐使用

public class Singleton2
{
    private readonly static object lockObj = new object();
    private static Singleton2 instance = null;
    private Singleton2() { }

    public static Singleton2 Instance
    {
        get
        {
            lock(lockObj)
            {
                if (instance == null)
                {
                    instance = new Singleton2();
                }
            }
            return instance;
        }
    }
}

实现3:饿汉式,线程安全

写法简单,线程安全,但构造时机不是由程序员掌控的:

public class Singleton3
{
    private static Singleton3 instance = new Singleton3();
    private Singleton3() { }
    public static Singleton3 Instance { get { return instance; } }

    public static void Test()
    {
        Console.WriteLine("test");
    }
}

当.NET运行时发现第一次使用Singleton3时会创建单例的实例,而不是在第一次调用Singleton3.Instance属性时创建,如进行以下操作:

Singleton3.Test();

实现4:懒汉式,双重校验锁

在实现2的基础上进行改进,只在第一次创建实例时加锁,提高访问性能:

public class Singleton4
{
    private readonly static object lockObj = new object();
    private static Singleton4 instance = null;
    private Singleton4() { }

    public static Singleton4 Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObj)
                {
                    if (instance == null)
                    {
                        instance = new Singleton4();
                    }
                }
            }
            return instance;
        }
    }
}

实现5:懒汉式,内部类

在方法3的基础上进行改进,确保只有访问Singleton5.Instance属性时才会构造实例:

public class Singleton5
{
    class Nested
    {
        internal static readonly Singleton5 instance = new Singleton5();
    }
    private Singleton5() { }
    public static Singleton5 Instance { get { return Nested.instance; } }
}

实现单例基类

通过单例基类,我们可以简单的通过继承创建一个单例类,实现代码复用:

// 由于单例基类不能实例化,故设计为抽象类
public abstract class Singleton<T> where T : class
{
    // 这里采用实现5的方案,实际可采用上述任意一种方案
    class Nested
    {
        // 创建模板类实例,参数2设为true表示支持私有构造函数
        internal static readonly T instance = Activator.CreateInstance(typeof(T), true) as T;
    }
    private static T instance = null;
    public static T Instance { get { return Nested.instance; } }
}

使用方法如下:

class TestSingleton : Singleton<TestSingleton>
{
    // 将构造函数私有化,防止外部通过new创建
    private TestSingleton() { }
}

参考资料

1、《剑指offer》

2、http://www.runoob.com/design-pattern/singleton-pattern.html

3、https://blog.csdn.net/ycl295644/article/details/46770451

原文地址:https://www.cnblogs.com/zhouzl/p/10687909.html

时间: 2024-10-07 03:43:59

C#单例类的实现的相关文章

java单例类/

java单例类  一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一但有了初始值,就不能被重新赋值 static修饰的成员变量可以在静态代码块中 或申明该成员时指定初始值 实例成员可以在非静态代码块中,申明属性,或构造器中指定初始值 final修饰的变量必须要显示初始化 final修饰引用变量不能被重新赋值但是可以改变引用对象的内容分(只要地址值不变) final修

c++:自己动手实现线程安全的c++单例类

前段时间使用c++做项目开发,需要根据根据配置文件路径加载全局配置文件,并对外提供唯一访问点.面对这样一个需求,自然的就想到了使用单例模式来创建一个单例配置对象,供外部调用.一开始想使用boost中自带的单例类来实现,但是遗憾的是,boost中的的单例类好像只能使用无参的类构造函数,而我希望将配置文件路径作为单例配置对象的构造函数参数,此外正好借此机会使用c++自己动手实现一个单例类. 1.线程安全的c++单例类 实现线程安全的c++单例类,主要要实现以下几点:1)构造函数私有化,即构造函数.拷

创建一个单例类

关于单例的概念此处不做表述,直接上代码演示如何创建一个单例类. 1 #import <Foundation/Foundation.h> 2 3 @interface MJDemo : NSObject 4 5 + (instancetype)sharedDemo; 6 7 @end 8 9 10 #import "MJDemo.h" 11 12 @implementation MJDemo 13 14 //在iOS中所有对象分配内存空间,最终都会调用allocWithZon

单例类的总结

/** * 单例类的两种方法. * 1.饿汉式 * 当类一加载就开始创建对象 * 2.懒汉式 * 当需要使用到类的对象是调用类的类方法才开始创建对象,想比较上面而言是 * 懒汉式. * 注意,单例类的特点: * 1.必须要将构造函数私有化,这样才能防止别的类通过构造方法来建立对象,但是也是因为如此,所以 * 单例类的成员变量和成员函数都必须要用static修饰,因此要想调用单例类的函数,只能通过类名.类方法的方式来进行 * 调用. * 2.必须要在类内创建一个本类的对象. * 3.向外提供一个公

第62课 单例类模板

1. 单例需求的提出 (1)在架构设计时,某些类在整个系统生命期中最多只能有一个对象存在(Single Instance) (2)问题:如何定义一个类,使得这个类最多只能创建一个对象 2. 单例模式 (1)要控制类的对象数目,必须对外隐藏构造函数 (2)思路 ①将构造函数的访问属性设置为private ②定义instance,并初始化为NULL ③提供静态函数getInstance来返回单例实例,并判断当instance的值为空时,并创建对象,并保存在instance指针中,非空值时直接返回in

单例类的实现

单例类:大概理解为只有一个对象的类,无论怎么创建都只有会分配一个内存 这几天,需要实现某个功能,而且在很多的类里面都要调用这个方法,所以我索兴就封装了一个类,直接调用这个类里面的方法就可以实现了,不需要每次都去写同一个方法(这是大背景),之后在在调用的时候我又发现我需要每次都要用同一个对象(重点来了),所以我才需要封装一个单例的类,而且这样不会浪费内存. 好了,直接上代码了: +(UIView*)initActivityIndictionView { static UIView *view =

单例类的创建

#import "SingalTon.h" @implementation SingalTon //实例变量不能在静态方法中使用 //需要定义成全局变量或者静态变量 static  SingalTon * _singleTon=nil; +(SingalTon *) ShareSingleTon { //    返回对象前需要判断,这个对象之前是否创建过,如果没有创建过,就需要创建一个对象,如果创建过,就把上一次创建的对象返回出去 // 多个线程同时访问单例类时,就会创建多个单例类,就

java 核心学习笔记(四) 单例类

如果一个类始终只能创建一个实例,那么这个类被称作单例类. 一些特殊的应用场景可能会用到,为了保证只能创建一个实例,需要将构造方法用private修饰,不允许在类之外的其它地方创建类的实例. 又要保证可以创建该类的实例,所以需要一个public方法来创建该类的实例,由于在创建之前并没有该类的对象存在,所以只能使用类来调用此方法,故用static修饰. 同时需要将该类创建得到的实例分配一个引用才能知道该实例是否存在与是否唯一,所以需要一个成员变量保存创建的对象,同时由于该对象由上述静态方法创建,则该

创建单例类

Main.m /* 创建单例类 */ int main(int argc, const char * argv[]) { // NSBundle *bundle = [NSBundle mainBundle]; // NSFileManager *fileManager = [NSFileManager defaultManager]; SingletonClass *single1 = [SingletonClass defaultClass]; SingletonClass *single2

单例类多线程

作为设计模式理论中的Helloworld,相信学习java语言的人,都应该听说过单例模式.单例模式作为对象的一种创建模式,它的作用是确保某一个类在整个系统中只有一个实例,而且自行实例化并向整个系统提供这个实例. 由此可见,单例模式具有以下的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一的实例. 单例类必须给所有其他对象提供这一实例. 由于Java语言的特点,使得单例模式在Java语言的实现上有自己的特点.这些特点主要表现在单例类如何将自己实例化. 饿汉式单例类 饿汉式单例类是在Ja