单例的各种方式实现,本写法以类A为例,泛型可以使用T
泛型 实现 方式 可以 各种 写法 单例 为例
2023-09-14 08:57:06 时间
单例的使用如下:
#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
相关文章
- Java泛型--泛型应用--泛型接口、泛型方法、泛型数组、泛型嵌套
- C语言实现泛型编程
- Java魔法堂:解读基于Type Erasure的泛型
- Java 泛型,你了解类型擦除吗?(转)
- React组件继承,泛型写法
- C# 泛型简介
- 通过泛型操作实现子窗体的不同操作
- Dart基础-泛型和库
- 泛型--前世今生
- Java的泛型中,通配符可以设置上限和下限
- JavaSE进阶 | 泛型机制和增强for循环
- C# 泛型(Generic)
- 《Kotlin极简教程》第6章 泛型
- 泛型
- 获取泛型的class 反射
- dao层的泛型实现(2种方法)
- go语言笔记——是c开发的 lex yacc进行词法和语法分析,go不支持函数和运算符重载,不支持类型继承,也不支持断言,还有泛型
- Java中的泛型简介