zoukankan      html  css  js  c++  java
  • C#设计模式:Singleton模式

    如何保证一个类只能有一个实例存在?
    在多线程情况下如何解决?
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Singleton
    {
        
    class Singleton
        
    {
            
    //构造函数私有化,保证不被显式实例化
            private Singleton() { }

            
    //定义属性,返回Singleton对象
            private static Singleton singleton;

            
    public static Singleton Instance
            
    {
                
    get
                
    {
                    
    if (singleton == null)
                        singleton 
    = new Singleton();
                    
    return singleton;
                }

            }

        }

    }


    //多线程版本的Singleton
    namespace SingletonMultiThread
    {
        
    class Singleton
        
    {
            
    private static object lockHelper = new object();

            
    //构造函数私有化,保证不被显式实例化
            private Singleton() {}

            
    //定义属性,返回Singleton对象
            private static volatile Singleton singleton = null;

            
    public static Singleton Instance
            
    {
                
    get
                
    {
                    
    if (singleton == null)
                    
    {
                        
    lock (lockHelper)
                        
    {
                            
    if (singleton == null)
                                singleton 
    = new Singleton();
                        }

                    }

                    
    return singleton;
                }

            }

        }

    }


    //经典的Singleton实现:仅仅适合无参构造器对象(可用属性实现扩展)
    namespace classicalSingleton
    {
        
    sealed class Singleton
        
    {
            
    private Singleton() { }
            
    //内联初始化,后面的new是个静态构造器
            public static readonly Singleton Instance = new Singleton();
        }


        
    class Program
        
    {
            
    static void Main(string[] args)
            
    {
                Singleton s1 
    = Singleton.Instance;
                Singleton s2 
    = Singleton.Instance;
                
    if (object.ReferenceEquals(s1, s2))
                    Console.WriteLine(
    "两个对象是相同的实例。");
                
    else
                    Console.WriteLine(
    "两个对象非相同的实例。");
            }

        }

    }

  • 相关阅读:
    Restful api 返回值重复的问题
    fastDFS遇到的并发问题recv cmd: 0 is not correct, expect cmd: 100
    忽略警告@SuppressWarnings的用法
    Mysql 一些命令记录
    python 操作excel实现替换特定内容
    python 提取目录中特定类型的文件
    python使用tkinter无法获取输入框的值
    python使用tkinter无法给顶层窗体的输入框设定默认值
    游戏基础知识第一弹
    python 3.7.4 安装 opencv
  • 原文地址:https://www.cnblogs.com/flaaash/p/1020841.html
Copyright © 2011-2022 走看看