剑指offer-面试题2.实例Singleton模式
2015-07-20 21:16
323 查看
题目:设计一个类,我们只能生成该类的一个实例
这道题显然是对设计模式的考察,很明显是单例模式。什么是单例模式呢,就是就像题目所说的只能生成一
个类的实例。那么我们不难考虑到下面几点:
1.不能new多个对象,那么必然该类的构造函数是私有的
2.类对象只有一个,那么必然该对象只能有一个私有的静态成员变量,该成员变量为类实例或者类实例的指针。
3.但是我们同时还要考虑到如果获取这个唯一对象实例,那么该类必然有一个公有的成员函数来获取这个唯一的
类实例然而由于不允许new对象,那么必须提供一种类操作该接口的方式,很显然就是静态成员函数。
至此不难写设计出这样一个类:
那么我们构造这个唯一实例是这样的:
当然也可以这样
上面的做法对于单线程来说可以表现的很好了,但是对于多线程来说,就可能有问题了。当两个线程
同时创建实例的时候,这时候实例不存在,这时候就可能产生两个类实例,于是我们就需要用同步的方
法保证创建的时候只有一个线程。线程同步的方法很多,可以是临界区,可以是互斥等。
这道题显然是对设计模式的考察,很明显是单例模式。什么是单例模式呢,就是就像题目所说的只能生成一
个类的实例。那么我们不难考虑到下面几点:
1.不能new多个对象,那么必然该类的构造函数是私有的
2.类对象只有一个,那么必然该对象只能有一个私有的静态成员变量,该成员变量为类实例或者类实例的指针。
3.但是我们同时还要考虑到如果获取这个唯一对象实例,那么该类必然有一个公有的成员函数来获取这个唯一的
类实例然而由于不允许new对象,那么必须提供一种类操作该接口的方式,很显然就是静态成员函数。
至此不难写设计出这样一个类:
class CSingle { private: CSingle() //私有构造函数,禁止new对象实例 { } static CSingle *m_pInstance; //私有静态全局变量,保证唯一性 public: static CSingle * GetInstance() //提供一个共有接口获取该唯一类实例 { if(m_pInstance == NULL) m_pInstance = new CSingle(); return m_pInstance; } };
那么我们构造这个唯一实例是这样的:
CSingle *Single=CSingle::GetInstance();//当该唯一实例不存在时,这是唯一获取类实例的方法。
CSingle *Single1=Single->GetInstance();//当上一步执行后便可用此方法获取唯一类实例
当然也可以这样
CSingle & Single1=Single->GetInstance();
上面的做法对于单线程来说可以表现的很好了,但是对于多线程来说,就可能有问题了。当两个线程
同时创建实例的时候,这时候实例不存在,这时候就可能产生两个类实例,于是我们就需要用同步的方
法保证创建的时候只有一个线程。线程同步的方法很多,可以是临界区,可以是互斥等。
相关文章推荐
- 中科创新面试题
- 黑马程序员——JAVA基础学习之其他对象
- Android\Java 面试题
- 剑指offer-面试题1:赋值运算符函数
- Android50道面试题
- 东华软件面试题
- 职业性格测验量表
- 黑马程序员-----自动装箱与拆箱
- 知识储备:软件开发校园招聘面试题
- 黑马程序员——Java学习总结:IO常用方法练习
- (剑指Offer)面试题29:数组中出现次数超过一半的数字
- 阿里面试题2015
- 黑马程序员----Java异常体系结构
- Java多线程面试常见核心问题总结
- 常见面试第三题之Activity的几种启动模式介绍
- 面试题总结8
- 职场中的十大低级错误
- 程序员辞职/跳槽的理由,亮点总在最后!
- 黑马程序员——JAVA基础------集合框架(二)----Set接口
- 程序员跳槽神级攻略