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

    概述

      单例模式可以简单理解为一个类只有一个实例化,并提供全局的访问点。

    单例模式存在的意义

      举个例子,在操作系统中,任务管理器只能存在一个,对吧。那么接下来的事情就是简单的实现单例模式了。

    实现简单的单例模式

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Singleton
     7 {
     8     public class Singleton
     9     {
    10         //使用静态变量保存类的实例
    11         private static Singleton uniqueInstance;
    12         
    13         //私有构造
    14         private Singleton()
    15         {
    16         }
    17 
    18         /// <summary>
    19         /// 全局访问点
    20         /// </summary>
    21         /// <returns></returns>
    22         public static Singleton GetInstance()
    23         {
    24             if (uniqueInstance==null)
    25             {
    26                 Console.WriteLine("实例化 单例模式.");
    27                 uniqueInstance = new Singleton();
    28             }
    29             else
    30             {
    31                 Console.WriteLine("返回 单例模式");
    32             }
    33             return uniqueInstance;
    34         }
    35 
    36     }
    37 
    38 
    39     class Program
    40     {
    41         static void Main(string[] args)
    42         {
    43             Singleton.GetInstance();
    44             Singleton.GetInstance();
    45         }
    46     }
    47 }

      1.  私有构造函数:

        只有在该类中使用,不能被外界访问。也就是说,该类不能通过外界 new操作 实例化一个对象。而只能在本类中实例化。

      2. 静态变量:

        静态变量是在堆分配的,而普通变量是在栈上分配的,也就是说它的生存期为整个源程序。

      3. 静态函数:

        静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。 这里,我们使用静态函数访问静态变量。

    多线程下的单例模式

      在上诉代码中,如果是多线程的情况,很有可能会创建多个实例化。但是我们想要的是,只要第一次创建该实例,其他情况都返回该实例。我们的解决方案是采用线程加锁的方式。

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Singleton
     7 {
     8     public class Singleton
     9     {
    10         //使用静态变量保存类的实例
    11         private static Singleton uniqueInstance;
    12         
    13         //私有构造
    14         private Singleton()
    15         {
    16         }
    17 
    18         
    19         //线程锁
    20         private static readonly object locker = new object();
    21 
    22         /// <summary>
    23         /// 全局访问点
    24         /// </summary>
    25         /// <returns></returns>
    26         public static Singleton GetInstance()
    27         {
    28             if (uniqueInstance==null)
    29             {
    30                 lock (locker)
    31                 {
    32                     if (uniqueInstance == null)
    33                     {
    34                         Console.WriteLine("实例化 单例模式.");
    35                         uniqueInstance = new Singleton();
    36                     }
    37                 }
    38             }
    39             else
    40             {
    41                 Console.WriteLine("返回 单例模式");
    42             }
    43             return uniqueInstance;
    44         }
    45 
    46     }
    47 
    48 
    49     class Program
    50     {
    51         static void Main(string[] args)
    52         {
    53             Singleton.GetInstance();
    54             Singleton.GetInstance();
    55         }
    56     }
    57 }
  • 相关阅读:
    怎样解决git提交代码冲突
    NSDate和NSString相互转换
    AsyncTask源代码翻译
    UVa 11094
    JavaScript中的*top、*left、*width、*Height具体解释
    Kali Linux下安装VMware Tools
    史上最简单,js并获取手机型号
    界面1
    学习向量量化神经网络
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Cha
  • 原文地址:https://www.cnblogs.com/jqm304775992/p/4968480.html
Copyright © 2011-2022 走看看