首页 > 其他分享 >单例的各种方式实现,本写法以类A为例,泛型可以使用T

单例的各种方式实现,本写法以类A为例,泛型可以使用T

时间:2023-04-01 12:03:06浏览次数:44  
标签:单例 为例 private static 以类 new linjieInstance public 构造函数

单例的使用如下:

#region 单例的各种方式实现,本写法以类A为例,泛型可以使用T

    public class A
    {
        #region 单线程----常规,多线程不安全
        ///// <summary>
        ///// 私有构造函数,防止初始化
        ///// </summary>
        //private A()
        //{

        //}

        ///// <summary>
        ///// 私有变量,延迟加载
        ///// </summary>
        //private static A linjieInstance = null;

        ///// <summary>
        ///// 公开实例,供外界使用
        ///// </summary>
        //public static A LinjieInstance
        //{
        //    get
        //    {
        //        if (linjieInstance == null)
        //        {
        //            linjieInstance = new A();

        //        }
        //        return linjieInstance;
        //    }
        //}
        #endregion

        #region 单线程----常规,多线程不安全---饿汉模式
        ///// <summary>
        ///// 私有构造函数,防止初始化
        ///// </summary>
        //private A()
        //{

        //}

        ///// <summary>
        ///// 私有变量,延迟加载
        ///// </summary>
        //private static readonly A linjieInstance = new A();

        ///// <summary>
        ///// 公开实例,供外界使用
        ///// </summary>
        //public static A LinjieInstance => linjieInstance;
        ////public static A LinjieInstance
        ////{
        ////    get
        ////    {
        ////        return linjieInstance;
        ////    }
        ////}
        #endregion

        #region 单线程----常规,多线程不安全---饥(饿)汉模式
        ///// <summary>
        ///// 私有构造函数,防止初始化
        ///// </summary>
        //private A()
        //{

        //}

        ///// <summary>
        ///// 私有变量,延迟加载
        ///// </summary>
        //private static readonly A linjieInstance = new A();

        ///// <summary>
        ///// 公开实例,供外界使用
        ///// </summary>
        //public static A LinjieInstance => linjieInstance;
        ////public static A LinjieInstance
        ////{
        ////    get
        ////    {
        ////        return linjieInstance;
        ////    }
        ////}
        #endregion

        #region 单线程----常规,多线程安全---饱(懒)汉模式---并发字典
        ///// <summary>
        ///// 私有构造函数,防止初始化
        ///// </summary>
        //private A()
        //{

        //}

        ///// <summary>
        ///// 私有变量,延迟加载
        ///// </summary>
        //private static readonly A linjieInstance = null;

        //private static readonly ConcurrentDictionary<int, A> keyValuePairs = new ConcurrentDictionary<int, A>();

        ///// <summary>
        ///// 公开实例,供外界使用
        ///// </summary>
        ////public static A LinjieInstance => keyValuePairs.GetOrAdd(0, new A()); 
        //public static A LinjieInstance
        //{
        //    get
        //    {
        //        return keyValuePairs.GetOrAdd(0, new A());
        //    }
        //}
        #endregion

        #region 单线程----常规,多线程安全---饱(懒)汉模式---Lazy<A>
        ///// <summary>
        ///// 私有构造函数,防止初始化
        ///// </summary>
        //private A()
        //{

        //}

        ///// <summary>
        ///// 私有变量,延迟加载
        ///// </summary>
        //private static readonly A linjieInstance = null;

        //private static readonly Lazy<A> LazyInstance = new Lazy<A>(() => new A());

        ////private static readonly Lazy<A> LazyInstance = new Lazy<A>(() => new A(),true);// isThreadSafe:true 表示此示例可由多个线程同时使用;false 表示此实例一次只能由一个线程使用。 

        ///// <summary>
        ///// 公开实例,供外界使用
        ///// </summary>
        ////public static A LinjieInstance => LazyInstance.Value; 
        //public static A LinjieInstance
        //{
        //    get
        //    {
        //        return LazyInstance.Value;
        //    }
        //}
        #endregion

        #region 单线程----常规,多线程安全---原子操作累加
        ///// <summary>
        ///// 变量
        ///// </summary>
        //private int linjieInstance;
        //public int GetValue() => Interlocked.Increment(ref linjieInstance);
        ////public int GetValue()
        ////{
        ////    return Interlocked.Increment(ref linjieInstance);
        ////}
        #endregion

        #region 单线程----常规,多线程安全---原子操作累加
        ///// <summary>
        ///// 变量
        ///// </summary>
        //private volatile int linjieInstance;
        //public int GetValue() => ++linjieInstance;
        ////public int GetValue()
        ////{
        ////    return ++linjieInstance;
        ////}
        #endregion

        #region 单线程----常规,多线程不安全----加锁
        ///// <summary>
        ///// 私有构造函数,防止初始化
        ///// </summary>
        //private A()
        //{

        //}

        ///// <summary>
        ///// 私有变量,延迟加载
        ///// </summary>
        //private static A linjieInstance = null;

        ///// <summary>
        ///// 锁
        ///// </summary>
        //private static readonly object objectlock = new object();

        ///// <summary>
        ///// 公开实例,供外界使用
        ///// </summary>
        //public static A LinjieInstance
        //{
        //    get
        //    {
        //        if (linjieInstance == null)
        //        {
        //            lock (objectlock)
        //            {
        //                if (linjieInstance == null)
        //                {
        //                    linjieInstance = new A();
        //                }
        //            }
        //        }
        //        return linjieInstance;
        //    }
        //}
        #endregion

        #region 单线程----常规,多线程不安全----私有静态内部类
        ///// <summary>
        ///// 私有构造函数,防止初始化
        ///// </summary>
        //private A()
        //{

        //}

        ///// <summary>
        ///// 公开实例,供外界使用
        ///// </summary>
        //public static A LinjieInstance => Nest.linjieInstance;
        ////public static A LinjieInstance
        ////{
        ////    get
        ////    {
        ////        return Nest.linjieInstance;
        ////    }
        ////}

        ///// <summary>
        ///// 内部静态类
        ///// </summary>
        //private class Nest
        //{
        //    /// <summary>
        //    /// 私有变量,延迟加载
        //    /// </summary>
        //    public static readonly A linjieInstance = null;

        //    static Nest()
        //    {
        //        linjieInstance = new A();
        //    }

        //    ////上面的写法还可以写成
        //    ///// <summary>
        //    ///// 私有变量,延迟加载
        //    ///// </summary>
        //    //public static readonly A linjieInstance = new A();
        //}
        #endregion
    }

    #region 单例的各种方式实现,本写法以泛型T
    public abstract class B<T> where T : class
    {
        #region 单线程----常规,多线程不安全----泛型
        /// <summary>
        /// 私有构造函数,防止初始化
        /// </summary>
        private B()
        {

        }

        /// <summary>
        /// 公开实例,供外界使用
        /// </summary>
        public static T LinjieInstance => Nest.linjieInstance;
        //public static T LinjieInstance
        //{
        //    get
        //    {
        //        return Nest.linjieInstance;
        //    }
        //}

        /// <summary>
        /// 内部静态类
        /// </summary>
        private class Nest
        {
            /// <summary>
            /// 私有变量,延迟加载
            /// </summary>
            internal static readonly T linjieInstance = null;

            static Nest()
            {
                //linjieInstance = new T();//必须有公开的构造函数,同时泛型约束SingletonBase<T> where T : class, new()
                //nonPublic:如果公共或非公共默认构造函数可以匹配,则为 true;如果只有公共默认构造函数可以匹配,则为 false。
                linjieInstance = Activator.CreateInstance(typeof(T), true) as T;
                //使用指定类型的默认构造函数来创建该类型的实例,公共或非公共默认构造函数可以匹配
                //linjieInstance = Activator.CreateInstance<T>() as T;
            }
        }
        #endregion
    }
    #endregion
    #endregion

 

龙腾一族至尊龙骑



标签:单例,为例,private,static,以类,new,linjieInstance,public,构造函数
From: https://blog.51cto.com/u_15693505/6163460

相关文章

  • 实战SQL优化(以MySQL深分页为例)
    1准备表结构CREATETABLE`student`(`id`intNOTNULLAUTO_INCREMENT,`user_no`varchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciNULLDEFAULTNULL,`user_name`varchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciNULLDEFAULTNULL......
  • 如何实现一个单例?
    构造函数需要private访问权限,这样避免外部通过new创建实例;考虑对象创建时的线程安全问题考虑是否支持延迟加载考虑getInstance性能是否高(是否加锁)1、饿汉式:点......
  • 为什么要使用单例模式?
    单例设计模式(SingletonDesignPattern)理解起来非常简单.一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式.简称单例模式.......
  • 说说双重检查加锁单例模式为什么两次判断?
    先列段代码:publicclassSingleton{privatestaticvolatileSingletonsingleton=null;privateSingleton(){}publicstaticSingletongetI......
  • 设计模式之单例模式C++实现
    初步用C++实现单例模式,暂未考虑线程安全问题#include<stdio.h>#include<iostream>usingstd::cout;usingstd::cin;usingstd::endl;//单例模式的设计需求:一个......
  • 将 Jenkins Pipeline 中的一个阶段标记为例如“不稳定”,但继续未来的阶段?
    stage('SignCode'){steps{script{try{pwd()sh"<YOURSCRIPTHERE>"}ca......
  • 如何使用Rust迭代器, 以Luhn Algorithm的实现为例
    本题来源自谷歌的Comprehensive-Rust课程第二天下午的练习问题描述在这个练习的描述中,LuhnAlgorithm是一种用来验证银行卡号是否合法的算法.他的具体流程如下:去掉......
  • 单例模式
    单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。单例模式的优点在于:系......
  • 修改U8启用模块日期以下以库存为例
    注意:以下方法仅适用于你所调整区间没有对应的表单业务发生,如确实要调整,需要删除调整区间内的业务表单,以下场景仅适用于初始化工作未完成需要重新初始化及业务单据不多情况:......
  • Java单例
    /***@Author:DengJia*@Date:2023/3/22*@Description:单例*/publicclassSingleton{publicstaticvoidmain(String[]args){System.out......