在诸多面试过程中,单态类是非常常见的一个问题。所谓单态类即仅能定义一个对象的类,其遵循设计模式中的单态模式。实际上,单态类在Java中是非常常见的,以下为C++单态类声明,其中NULL为空指针宏定义。
- classSingleton
- {
- public:
- staticSingleton*GetInstance(void);
- protected:
- Singleton(){}
- private:
- staticSingleton*m_pInstance;
- };
- Singleton*Singleton::m_pInstance=NULL;
- Singleton*Singleton::GetInstance(void)
- {
- if(NULL==m_pInstance)
- {
- returnnewSingleton();
- }
- returnm_pInstance;
- }
如果足够细心,便可以发现上述单态类的奇特之处:没有析构函数!在实际生成实例的函数GetInstance()中使用new操作符分配的内存,但却没有对应的析构函数释放该内存。如此,是否存在内存泄露的隐患呢?针对此问题,以下简单分析下。
尽管C++中仍然保留了C语言中的诸如全局变量(或称全局对象)的很多特性,然而从面向对象角度来看,C++是不鼓励使用全局对象的。鉴于此,单态类很多时候是替代C语言中的全局变量的,遵循设计模式中的单态模式。单态类之所以仅允许用户创建一个实例,本质在于使用了静态成员变量,而其性质是全局的。全局对象在程序运行期间都不会被销毁,而当程序运行结束时全局对象中涉及的内存会被自动回收,此时已经无所谓内存泄露了。因此,上述单态类声明中没有声明析构函数以释放内存。
从实际产品开发尤其是嵌入式产品开发角度,上述单态类是存在隐患的,即使用new分配内存。嵌入式产品的内存一般都是极为珍贵的,其不能保证使用new每次都能申请到内存。鉴于此,嵌入式产品中使用单态类时,一般会先定义一个较大的全局静态数组,然后在GetInstance()函数中使用placement new操作符在指定的全局静态数组中申请内存段,以保证安全性。此时,delete操作一般是无意义的。
本文所述仅为最简单的单态类声明,而产品开发中的需求并非如此简单,可能还涉及一些资源的释放或继承等需求,不在本文论述范畴,不再赘述。
分享到:
相关推荐
单态模式单态模式单态模式
设计模式一点通之单态模式 C++ 挺好的,都来下下
单态模式单态模式单态模式
Java实现单态登录
是个使用java实现的单态例子,开始接触java单态的或是不了解单态是怎么实现的同僚,是个不错的参考
Java实现的单态登陆,里面有详细代码注释,也可参展这篇博客看看实现思路:http://blog.csdn.net/hongfeideng/article/details/7023865
这个一个简单的java例子,可以为新手加深对java单态模式的理解.....
Net单态模式的案例 本人收藏了3年的资源 现放出 都是总结了很多系统 软件项目实施过程中的经验的 慢慢积累的
MyEclipse\单态.rar
单态模式的定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 在项目的很多地方都会用到它,比如说数据库的链接。 使用Singleton的好处还在于可以节省内存,因为它限制了实例...
单态登录的源代码
设计模式是在大量的实践中总结和理论化之后优选 的代码结构、编程风格以及解决问题的思考方式。
在C#、Java里面常用单态模式,单态模式的好处就不必说了,可提高代码的运行效率....按现有网站上搜索资料写单态模式时,调试总是提示失败,因此自己动手写一个例子供广大mfc入门学习者参考。
单态模式的设计和应用--设计模式之Singleton(单态)
单态模式和工厂模式.ppt单态模式和工厂模式.ppt
有利于学习和掌握单态模式,是我们学习的关键
二、单态类的特性 19 三、饿汉式单态类 19 四、懒汉式单态类 20 五、两种单态的区别 20 【二】、装饰者模式 20 一、装饰者模式(Decorator Pattern) 20 二、装饰者模式的特性 21 【三】、简单工厂模式 22 简单工厂...
设计模式之Singleton(单态)
主要介绍了php简单实现单态设计模式的方法,简单分析了单态设计模式的构成、实现与使用方法,需要的朋友可以参考下
单态模式和简单工厂模式.doc