zoukankan      html  css  js  c++  java
  • 单例模式之见解设计模式

          说起来工作也几年,突然发现比较少去写日记做总结,因此在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();
            }
        }
    

      

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

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

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

      

  • 相关阅读:
    c#的运算符
    modbus-poll和modbus-slave工具的学习使用——modbus协议功能码1的解析
    modbus-poll和modbus-slave工具的学习使用——环境搭建
    STM32L4R9使用HAL库调试IIC注意事项
    蓝牙透传——介绍蓝牙最简单、最常见的通讯方式
    Chapter 2 Open Book——11
    Chapter 2 Open Book——10
    Chapter 2 Open Book——9
    线程中sleep方法和wait方法有什么区别?
    你所不知道的mybatis居然也有拦截器
  • 原文地址:https://www.cnblogs.com/luoliang/p/2924213.html
Copyright © 2011-2022 走看看