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();
            }
        }
    

      

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

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

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

      

  • 相关阅读:
    laravel 的passport Oauth 认证登录请求 的 oauth_token 重置
    多个php版本的composer使用
    MySQL查询语句练习题(面试时可能会遇到哦!)
    tp5 url 线上访问 在nginx 上 出现404错误,解决办法(1.80nginx 配置 pathInfo)
    源码编译安装lnmp环境(nginx-1.14.2 + mysql-5.6.43 + php-5.6.30 )------踩了无数坑,重装了十几次服务器才会的,不容易啊!
    Mysql错误处理: /usr/bin/mysqld_safe: line xxx: xxxx Killed ... (mysql自动停止 Plugin FEDERATED is disabled 的完美解决方法)
    Plugin 'FEDERATED' is disabled. /usr/sbin/mysqld: Table 'mysql.plugin' doesn't exist
    thinkphp5的mkdir() Permission denied问题
    微信小程序 Unexpected end of JSON input/Unexpected token o in JSON at position 1
    服务器 apache配置https,http强制跳转https(搭建http与https共存)
  • 原文地址:https://www.cnblogs.com/luoliang/p/2924213.html
Copyright © 2011-2022 走看看