单例模式之见解设计模式

      说起来工作也几年,突然发现比较少去写日记做总结,因此在2013年开始之际,决定现在开始每隔一段时间上来这里写写,帮助自己总结。

      这次就先从设计模式开始,说起设计模式我想很多码农都知道了,就不在详细说,但是这里单说说我常见到的几种,现在以单例开始吧。    

      说起单例模式,熟悉了吧,在一些项目中,比如读取配置文件中会用到,或者在控制依赖反转中也会用到,自己想了下写了个,C#代码如下:

    /// <summary>
    /// 单例模式:控制继承、构造、静态实现
    /// </summary>
    public sealed class SinglePattern
    {
        private static readonly SinglePattern instance;
        private SinglePattern()
        {
        }

        static SinglePattern()
        {
                instance = instance ?? new SinglePattern();
        }

        public static SinglePattern getInstance
        {
            get
            {
                return instance;
            }
        }
    }

  

首先代码用了关键字sealed,阻止继承实现后New实例化;构造中在上private,表示外部不可以访问,只能在内部new,静态构造保证实例化时先对静态对象赋值;再定义私有静态对象这里直接new实例化;通常项目中我们也就这样做了,这个比起来使用对象双重锁定代码简洁多了,用了.net的static静态初始化特性来解决。不过这也有问题,就是机制是可以保证只有一个对象,但是在实例化时对象时没有加以控制,所以后来有些人推荐不使用静态字段,而把实例化直接交给一个内部类来到达延迟初始化的作用,C#代码如下:

    /// <summary>
    /// 单例模式:控制继承、构造、静态、内部类延迟初始化实现
    /// </summary>
    public sealed class SinglePattern01
    {
        private SinglePattern01()
        {
        }

        public static SinglePattern01 getInstance
        {
            get
            {
                return CreateInstance.SinglePattern;
            }
        }

        private class CreateInstance
        {
            static CreateInstance()
            {
            }
            internal static readonly SinglePattern01 SinglePattern = new SinglePattern01();
        }
    }

在上面的代码中,实例化这个工作直接交给一个私有的内部类CreateInstance去执行,这个内部类是私有外部无法访问,使用静态构造加以控制静态字段New.只有去到达延迟初始化。全部代码如下:

/// <summary>
    /// 单例模式:控制继承、构造、静态实现
    /// </summary>
    public sealed class SinglePattern
    {
        private static readonly SinglePattern instance ;
        private SinglePattern()
        {
        }

        static SinglePattern()
        {
                instance = instance ?? new SinglePattern();
        }

        public static SinglePattern getInstance
        {
            get
            {
                return instance;
            }
        }
    }


    /// <summary>
    /// 单例模式:控制继承、构造、静态、内部类延迟初始化实现
    /// </summary>
    public sealed class SinglePattern01
    {
        private SinglePattern01()
        {
        }

        public static SinglePattern01 getInstance
        {
            get
            {
                return CreateInstance.SinglePattern;
            }
        }

        private class CreateInstance
        {
            static CreateInstance()
            {
            }
            internal static readonly SinglePattern01 SinglePattern = new SinglePattern01();
        }
    }

  

当然除了这样做外还可以使用对象的双重锁定来实现,在这里就没有提供了。

这个单例模式就到这里,以后会加以说明下!这里再整理了一下代码,提供下载

这几天更新了下,把日志也加进来,听过配置文件来是否启用配置文件,当然还有不好的地方。项目代码提供下载

  

原文地址:https://www.cnblogs.com/luoliang/p/2924213.html