zoukankan      html  css  js  c++  java
  • 设计模式

    单例模式, 顾名思义, 就是共用同一个实体对象. 

    对于共用, 首先想到的就是static静态变量, 那么怎么使用static去实现单例呢.

    一、单线程单例模式

    由于这个模式的实现还是比较简单的, 所以直接上代码.(不推荐使用此方式)

    public class A
    {
        public int Num { get; set; }
    
        private static A instance;
            
        private A()
        {
            Num = -1;
        }
    
        public static A Create()
        {
            if (instance == null)
            {
                instance = new A();
            }
            return instance;
        }
    }

    私有化构造函数之后, 外部就不能通过new A()的方式来实例化A类. 那么此时, 需要提供一个私有化的静态变量和一个公有化的静态方法, 来辅助实现单例模式.

    测试代码如下:

    static void Main(string[] args)
    {
        //A a = new A(); //error
    
        A a = A.Create();
        a.Num = 0;
        Console.WriteLine("a.Num = " + a.Num);
        Console.WriteLine("---------------------");
    A b
    = A.Create(); b.Num = 1; Console.WriteLine("b.Num = " + b.Num); Console.WriteLine("a.Num = " + a.Num); Console.ReadKey(); }

    这种方式是最直观的. 当然, 这里用的是字段和函数结合的方式, 使用属性的方式, 也是可以的, 不在赘述.

    下面介绍另一种方式.

    方式二、使用readonly的特性来实现单例模式

    public static A Instance { get { return instance; } }
    
    private static readonly A instance = new A();
    
    public int Num { get; set; }
    
    private A()
    {
        Num = -1;
    }

    测试代码是差不多的, 只不过, 获取实例的方式变了

    A a = A.Instance;
    a.Num = 0;
    Console.WriteLine("a.Num = " + a.Num);
    Console.WriteLine("---------------------");
    
    A b = A.Instance;
    b.Num = 1;
    Console.WriteLine("b.Num = " + b.Num);
    Console.WriteLine("a.Num = " + a.Num);
    
    Console.ReadKey();

    结果是一样的, 就不再贴了.

    二、多线程单例模式

    private static object b = new object();
    
    private static A instance;
    public static A Instance
    {
        get
        {lock (b)
            {
                if (instance == null)
                {
                    instance = new A();
                }
            }
        return instance;
        }
    }

     三、还有一种延迟实例化 - 用内部来来完成初始化工作

    public int Num { get; set; }
    
    private A()
    {
        Num = -1;
    }
    
    public static A Instance
    {
        get { return InClass.Instance; }
    }
    
    class InClass
    {
        static InClass() { }
    
        internal static readonly A Instance = new A();
    }

    参考资料:

    Implementing the Singleton Pattern in C#

  • 相关阅读:
    使用MFC界面库LibUIDK制作超酷界面
    使用WSH和WMI实现定时记录系统CPU和内存使用率
    关于CreateFileMapping的问题
    360对NSIS误报Malware.QVM06.GEN的解决办法
    win2003实现单用户远程登录
    All bytes must be within the maximum size specified by CreateFileMapping
    解决在VS2005中“当前不会命中断点。源代码与原始版本不同”的问题
    static library中能不能带资源
    HUDSON_HOME
    USB GUID查找
  • 原文地址:https://www.cnblogs.com/elvinle/p/6133824.html
Copyright © 2011-2022 走看看