• 单例模式(Singleton Pattern)


    动机:

    在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。

    如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

    这应该是类设计者的责任,而不是使用者的责任。

    意图:

    保证一个类仅有一个实例,并提供一个该实例的全局访问点。

    单线程Singleton模式的几个要点

    • Singleton模式中的实例构造器可以设置为protected以允许子类派生。
    • Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
    • Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
    • Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
    • 不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。

     1 namespace 单例设计模式
     2 {
     3     public class Singleton
     4     {
     5         //定义一个静态变量
     6         private static Singleton singleton;
     7         public static object obj = new object();
     8 
     9         //定义一个私有的构造函数
    10         private Singleton() { }
    11 
    12         //定义一个静态初始化方法
    13         public static Singleton Instance()
    14         {
    15             if (singleton == null)
    16             {
    17                 lock (obj)
    18                 {
    19                     if (singleton == null)
    20                     {
    21                         singleton = new Singleton();
    22                     }
    23                 }
    24             }
    25 
    26             return singleton;
    27         }
    28     }
    29 }
    30 
    31 //针对C#语言特性,单例模式的简单实现方法
    32 namespace 单态设计模式
    33 {
    34     public sealed class Singleton
    35     {
    36         //定义一个静态变量
    37         private static readonly Singleton singleton = new Singleton();
    38 
    39         //定义一个私有的构造函数
    40         private Singleton() { }
    41 
    42         //定义一个静态初始化方法
    43         public static Singleton Instance()
    44         {
    45             return singleton;
    46         }
    47     }
    48 }
    49 
    50 //客户端代码
    51 namespace 单例设计模式
    52 {
    53     class Program
    54     {
    55         static void Main(string[] args)
    56         {
    57             Singleton s1 = Singleton.Instance();
    58             Singleton s2 = Singleton.Instance();
    59 
    60             if (s1 == s2)
    61             {
    62                 Console.WriteLine("两个对象相等!");
    63             }
    64             else
    65             {
    66                 Console.WriteLine("两个对象不相等!");
    67             }
    68 
    69             Console.ReadKey();
    70         }
    71     }
    72 }
    View Code
  • 相关阅读:
    Nginx重写请求后将url?后的参数去除
    Nginx重写请求后将url?后的参数去除
    Nginx重写请求后将url?后的参数去除
    FastReport.Net中使用列表和数组作为报表数据源
    FastReport.Net中使用列表和数组作为报表数据源
    FastReport.Net中使用列表和数组作为报表数据源
    FastReport.Net中使用列表和数组作为报表数据源
    PHP可变参数
    推陈出新:网友解锁 source 命令新的姿势,血的教训!已准备跑路
    分析这家薄利多销的酸菜鱼面,看它的经营之道
  • 原文地址:https://www.cnblogs.com/zhxlsuyu/p/3512069.html
Copyright © 2020-2023  润新知