• 单例模式


    1.什么是单例模式?

      单例模式就是保证进程中某一个类只有一个实例。

    2.为什么要有单列模式?

      1)构造对象需要耗时好资源 

      2)一个对象可能会在多个地方存在 

      3)想避免对象重复构造

    3.怎么保证只有一个实例?

      1)私有化构造函数,避免别人去实例化对象

      2)在类里面提供一个公开的静态方法,在静态方法里面实例化对象

      3)初始化一个公开的静态字段用于返回实例化的对象,保证全局只有一个对象

    4.应对一些特殊情况:比如数据库连接池,全局唯一号码生成器

    5.单例的两种模式

      1)经典模式:就是我们经常说的双IF+锁(Lock)

        

     1 public class Singleton
     2     {
     3         private static Singleton _singleton = null;
     4         private static object _isLock = new object();
     5 
     6         public static Singleton CreateIntance()
     7         {
     8             //对象_singleton已经被初始化了就不要进入锁等待了
     9             if (_singleton == null)
    10             {
    11                 //加锁,保证任意时刻只有一个线程进入lock范围
    12                 lock (_isLock)
    13                 {
    14                     Thread.Sleep(3000);
    15                     Console.WriteLine("等待锁2s之后在继续...");
    16                     //对象是否已经创建
    17                     if (_singleton == null)
    18                     {
    19                         _singleton = new Singleton();
    20                     }
    21                 }
    22             }
    23             return _singleton;
    24         }
    25 }

      2)饥饿模式

      

     1 public class Hungry
     2     {
     3         private static Hungry _singleton = null;
     4         private static Hungry _singleton1 = new Hungry();
     5         /// <summary>
     6         /// 静态构造函数:由CLR保证,程序第一次使用这个类型前被调用一次,并且只调用一次
     7         /// 检测,初始化,
     8         /// 写日志功能的文件夹检测
     9         /// XML配置文件
    10         /// </summary>
    11         static Hungry()
    12         {
    13             _singleton = new Hungry();
    14             Console.WriteLine($"Hungry 被启用...");
    15         }
    16 
    17         /// <summary>
    18         /// 恶汉模式,只要使用这个类就会被调用
    19         /// </summary>
    20         /// <returns></returns>
    21         public static Hungry CreateIntance()
    22         {
    23             return _singleton;
    24         }
    25 
    26         /// <summary>
    27         /// 静态字段在第一次使用这个类之前,由CLR保证初始化并且只初始化一次(比构造函数还早)
    28         /// 恶汉模式,只要使用这个类就会被调用
    29         /// </summary>
    30         /// <returns></returns>
    31         public static Hungry CreateIntance1()
    32         {
    33             return _singleton1;
    34         }
    35     }
    将来的你,一定会感谢现在努力的自己!
  • 相关阅读:
    基于腾讯开源的msec来进行php开发模块
    《每周一点canvas动画》——圆周运动
    Socket.io+Notification实现浏览器消息推送
    10行 JavaScript 实现文本编辑器
    zzuli2228: 神奇的排名
    HDU2044:一只小蜜蜂...
    zzuli2226:神奇的薯条
    HDU2028:Lowest Common Multiple Plus
    HDU2036:改革春风吹满地
    HDU2029:Palindromes _easy version
  • 原文地址:https://www.cnblogs.com/GreatPerson/p/13333945.html
Copyright © 2020-2023  润新知