架构师_设计模式_结构型_单例模式

1:实现单例模式的

  1:构造函数私有化,提供公共静态方法给外面访问,定义一个静态变量保存实例 加上双重判断和锁   这个也叫懒汉单例模式  在单例类里面定义方法,方法是先执行

  2:静态构造函数,由CLR控制,且只调用一次,也叫饿汉单例模式, 定义的静态方法必须先构造这个实例再执行

2:为什么使用单例

  对象的重用,性能快速 ,十几万个对象 重复实例 性能损失大

  例子 数据库连接池 一般有十个线程,用完就还回去,如果不用单例,那么十个用完了,别人就需要等待了,

  单例模式解决不了多线程安全问题, 当十万个对象同时访问单例,会出现线程冲突 能丢失几十个左右的线程

 

3:单利模式也有缺点,当需要使用重复的对象的时候,会造成对象的污染, 每一次实例化的类都会覆盖前面的,因为他们使用的是共同的一个对象,所以此时就可以使用原型模式

优先使用饿汉单例模式,线程安全;

using System;

namespace 单例模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }

    //饿汉单例模式
    public class HungryManSingeletionMode
    {
        //第一步 构造函数私有化
        //第一步私有化构造函数
        private HungryManSingeletionMode()
        {
            Console.WriteLine("饿汉构造函数");
        }
        //第二步 定义私有静态类 初始化为null
        private static HungryManSingeletionMode _hungryManSingeletionMode=null;

        //第三步 创建静态构造函数:由CLR保证,在第一次使用到这个类型之前,自动被调用且只调用一次
        //很多初始化都可以在这里完成
        static HungryManSingeletionMode()
        {
            _hungryManSingeletionMode = new HungryManSingeletionMode();
        }
        //第四步提供公共方法访问
        public static HungryManSingeletionMode createSingeletion()
        {
            return _hungryManSingeletionMode;
        }

    }
    //懒汉单例模式 双判断加锁
    public class LazyManSingeletionMode
    {
        //第一步私有化构造函数
        private LazyManSingeletionMode() 
        {
            Console.WriteLine("懒汉构造函数");
        }
        //第二步 定义私有静态变量
        private static LazyManSingeletionMode _LazyManSingeletionMode = null;

        //第三步提供公共方法访问

        public static void getSingeLetionMode()
        {
            //第六步加双重判断 防止多线程
            if(_LazyManSingeletionMode == null){ 
            //第五步加锁防止多线程
            lock (ModeLock)
            {
                //第四步 外卖要实例化的时候 保证方法只实例化类一次
                if (_LazyManSingeletionMode == null)
                {
                    _LazyManSingeletionMode = new LazyManSingeletionMode();
                }
            }
            }
        }
        //第五步 定义静态只读变量加锁 防止多个人同时进来,
        private static readonly object  ModeLock=new object();
    }
}

 

posted @ 2020-05-18 11:22  12不懂3  阅读(165)  评论(0编辑  收藏  举报
创作不易,请勿抄袭,欢迎转载!