zoukankan      html  css  js  c++  java
  • C# 设计模式-单例模式

    一.介绍  

      单例模式(Singleton Pattern)。属于创建型模式。它保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    二.实现

      结构为,一个私有的静态变量,用于存放该实例。私有的构造函数,防止外部直接创建该类实例。

      创建单例模式有两种方式。饿汉式和懒汉式。

      饿汉式是直接在程序中初始化一个对象实例。

    //饿汉式
    public class Singleton
    {
        /// <summary>
        /// 私有的静态变量,直接初始化
        /// </summary>
        private static Singleton Instance = new Singleton();
    
        /// <summary>
        /// 私有的构造函数
        /// </summary>
        private Singleton()
        {
    
        }
    
        /// <summary>
        /// 获取静态实例的静态方法
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            return Instance;
        }
    }

      上面饿汉式创建的单例模式有一个缺点,就是程序不使用也会创建一个实例,这样会占内存。而使用懒汉式创建的单例模式,是需要使用的时候,才去创建实例。

    //懒汉式
    public class Singleton2
    {
        /// <summary>
        /// 私有的静态变量
        /// </summary>
        private static Singleton2 Instance = null;
    
        /// <summary>
        /// 私有的构造函数
        /// </summary>
        private Singleton2()
        {
    
        }
    
        /// <summary>
        /// 获取静态实例的静态方法
        /// </summary>
        /// <returns></returns>
        public static Singleton2 GetInstance()
        {
            if (Instance == null)
            {
                Instance = new Singleton2();
            }
            return Instance;
        }
    }

      上面两种创建单例模式的方法在单线程使用的时候没有问题,饿汉式创建的实例在多线程中也没有问题,懒汉式创建的实例在多线程中就会出现问题。我们可以通过lock关键字在多线程中保证单例。

    //单例模式 双重检查
    public class Singleton3
    {
        /// <summary>
        /// 私有的静态变量
        /// </summary>
        private static Singleton3 Instance = null;
        private static object locker = new object();
    
        /// <summary>
        /// 私有的构造函数
        /// </summary>
        private Singleton3()
        {
    
        }
    
        /// <summary>
        /// 获取静态实例的静态方法
        /// </summary>
        /// <returns></returns>
        public static Singleton3 GetInstance()
        {
            //先检查Instance是否为null,防止每次调用都锁定locker,影响性能
            if (Instance == null)
            {
                //使用lock
                lock (locker)
                {
                    if(Instance == null)
                    {
                        Instance = new Singleton3();
                    }
                }
            }
            return Instance;
        }
    }

      参考 https://www.cnblogs.com/restartyang/articles/7770856.html

  • 相关阅读:
    CODEFORCES 429B 动态规划
    HDU 2084(DP)
    最大公约数算法(待续)
    spring---aop 配置
    代理模式
    spring--学习之IOC DI
    spring--基本介绍
    JAVASE 面试总结(1)
    工厂模式
    建造者模式
  • 原文地址:https://www.cnblogs.com/shadoll/p/14246061.html
Copyright © 2011-2022 走看看