zoukankan      html  css  js  c++  java
  • 通用单例模式

    单例模式

    单例模式是许多开发人员最先接触到的模式之一,可以认为就是一个全局变量。它的初始化过程无非就是一开始就是创建一个实例,或者延迟初始化等需要用到的时候创建一个实例。这里需要注意的是多线程情况下创建一个实例,通常需要加锁(Lock)来解决问题。这里我们可以利用C#的系统函数Interlocked.CompareExchange来实现。

    1 常用单例模式

    internal class SingletonOne
    {
        private static SingletonOne _singleton;
        private SingletonOne(){}
        public static SingletonOne Instance
        {
            get
            {
                if(_singleton==null)
                {
                    Interlocked.CompareExchange(ref _singleton,new SingletonOne(),null);
                }
                return _singleton;
            }
        }
    }
    

    2 通用单例模式

    /// <summary>
    /// 通用单例模式
    /// </summary>
    /// <typeparam name="T">泛型</typeparam>
    public class Singleton<T>
    {
        static Dictionary<Type, object> _lockers = new Dictionary<Type, object>();
        static T _instance;
        /// <summary>
        /// 获取对象实例
        /// </summary>
        /// <param name="parameters">参数</param>
        /// <returns></returns>
        public static T GetInstance(params object[] parameters)
        {
            if (_instance == null)
            {
                Type type = typeof(T);
                var locker = _lockers.GetOrDefault(type);
                if (locker == null)
                {
                    lock (_lockers)
                    {
                        locker = _lockers.Get(type, x => new object());
                    }
                }
                lock (locker)
                {
                    if (_instance == null)
                    {
                        var cons =
                            type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)
                                .FirstOrDefault();
                        _instance = (T)cons.Invoke(parameters);
                    }
                }
            }
            return _instance;
        }
    }
    
  • 相关阅读:
    Bzoj 3907: 网格
    [***]HZOJ 哪一天她能重回我身边
    HZOJ 那一天她离我而去
    HZOJ 那一天我们许下约定
    卡特兰数表
    组合数表
    [***]HZOJ 超级树
    HZOJ 砍树
    HZOJ 星际旅行
    「BZOJ2510」弱题
  • 原文地址:https://www.cnblogs.com/jianxuanbing/p/5557769.html
Copyright © 2011-2022 走看看