• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++和java设计模式之单例模式

C++和java设计模式之单例模式

作者:jiayayao 字体:[增加 减小] 来源:互联网 时间:2017-05-28

jiayayao 通过本文主要向大家介绍了java单例设计模式,java中单例设计模式,java设计模式单例模式,java设计模式,java设计模式详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。其构造过程由自身完成,可以将构造方法定义为private型的,这样外界就只能通过定义的静态的函数Instance()构造实例,这个函数的目的就是返回一个类的实例,在此方法中去做是否有实例化的判断。客户端不再考虑是否需要去实例化的问题,把这些都交给了单例类自身。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法,就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

C++版本:

  template <class T>
  class Singleton
  {
  public:
    static inline T* Instance();
    static inline void ReleaseInstance();

  private:
    Singleton(void){}
    ~Singleton(void){}
    Singleton(const Singleton&){}
    Singleton & operator= (const Singleton &){}

    static std::auto_ptr<T> m_instance;
    static ThreadSection m_critSection;
  };

  template <class T>
  std::auto_ptr<T> Singleton<T>::m_instance;

  template <class T> 
  ThreadSection Singleton<T>::m_critSection;

  template <class T>
  inline T* Singleton<T>::Instance()
  {
    AutoThreadSection aSection(&m_critSection);
    if( NULL == m_instance.get())
    {
      m_instance.reset ( new T);
    }

    return m_instance.get();
  }
  template<class T>
  inline void Singleton<T>::ReleaseInstance()
  {
    AutoThreadSection aSection(&m_critSection);
    m_instance.reset();
  }

#define DECLARE_SINGLETON_CLASS( type ) \
  friend class std::auto_ptr< type >;\
    friend class Singleton< type >;
</div>

   多线程时Instance()方法加锁保护,防止多线程同时进入创建多个实例。m_instance为auto_ptr指针类型,有get和reset方法。发现好多网上的程序没有对多线程进行处理,笔者觉得这样问题很大,因为如果不对多线程处理,那么多线程使用时就可能会生成多个实例,违背了单例模式存在的意义。加锁保护就意味着这段程序在绝大部分情况下,运行是没有问题的,这也就是笔者对自己写程序的要求,即如果提前预料到程序可能会因为某个地方没处理好而出问题,那么立即解决它;如果程序还是出问题了,那么一定是因为某个地方超出了我们的认知。

  再附一下Java版的单例模式:

public class Singleton {
  private Singleton() {    
  }
  
  private static Singleton single = null;
  
  public static Singleton getInstance() {
    if (single == null) {
      synchronized (Singleton.class) {
        if (single == null) {
          single = new Singleton();
        }        
      }
    }
    
    return single;
  }
}
</div>

   上述代码中,一是对多线程做了处理,二是采用了双重加锁机制。由于synchronized每次都会获取锁,如果没有最外层的if (single == null)的判断,那么每次getInstance都必须获取锁,这样会导致性能下降,有了此判断,当生成实例后,就不会再获取锁。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++和java设计模式之单例模式

相关文章

  • 2017-05-28C语言实现获取内存信息并输出的实例
  • 2017-05-28深入C++拷贝构造函数的总结详解
  • 2017-05-28C++改变编程入口为main函数
  • 2017-05-28operator new在C++中的各种写法总结
  • 2017-05-28使用C语言判断英文字符大小写的方法
  • 2017-05-28C语言嵌入informix基础入门示例讲解
  • 2017-05-28c++函数指针和回调函数示例
  • 2022-04-30C语言数据类型转换(自动类型转换+强制类型转换)
  • 2017-05-28解析c++中的默认operator=操作的详解
  • 2017-05-28c语言中十进制转二进制显示小工具的实现代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • linux内核select/poll,epoll实现与区别
    • 深入剖析Android中init进程实现的C语言源码
    • 浅析C语言中typeof关键字用法
    • C++ 中静态成员函数与非静态成员函数的区别
    • C语言代码中的空白符
    • C语言中条件编译详解
    • 与ASCII码相关的C语言字符串操作函数
    • VC小技巧汇总之控件技巧
    • C语言求连续最大子数组和的方法
    • C++基于递归和非递归算法求二叉树镜像的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有