【那些年遇到过的面试题】单例和静态类
来源:互联网 发布:触碰心灵的话 知乎 编辑:程序博客网 时间:2024/05/18 00:43
单例模式只产生一个实例,适用于线程安全的工厂模式
静态类方法是在加载类的时候会用到的方法,无需new一个对象
如果类中只有方法没有属性,静态类合适
如果类中既有方法又有方法,且方法可以修改,则用单例
首先,单例可以继承类,实现接口,而静态类不能(可以集成类,但不能集成实例成员);
其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化;
再次,单例类可以被集成,他的方法可以被覆写;
最后,单例类可以被用于多态而无需强迫用户只假定唯一的实例。
单例模式的资源释放:
class CSingleton{
//其他成员
public:
static CSingleton* GetInstance();
private:
CSingleton(){};
static CSingleton * m_pInstance;
class CGarbo //它的唯一工作就是在析构函数中删除CSingleton的实例
{
public:
~CGarbo()
{
if( CSingleton::m_pInstance )
delete CSingleton::m_pInstance;
}
}
Static CGabor Garbo; //定义一个静态成员,程序结束时,系统会自动调用它的析构函数
};
类CGarbo被定义为CSingleton的私有内嵌类,以防该类被在其他地方滥用。
程序运行结束时,系统会调用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。
注意了,在代码部分
静态成员定义(cpp文件):
CSingleton* CSingleton::m_pInstance = NULL;
CSingleton::CGarbo CSingleton::Garbo; //这个很重要
单例模式实现(线程安全,这样答比较):
class Singleton{
private:
static Singleton* m_instance;
Singleton(){}
public:
static Singleton* getInstance();
};
Singleton* Singleton::getInstance()
{
if(NULL == m_instance)
{
Lock();//借用其它类来实现,如boost
if(NULL == m_instance)
{
m_instance = new Singleton;
}
UnLock();
}
return m_instance;
}
0 0
- 【那些年遇到过的面试题】单例和静态类
- 【那些年遇到过的面试题】孩子 面试题
- 【那些年遇到过的面试题】 动态库 & 静态库
- 【那些年遇到过的面试题】关键字volatile
- 【那些年遇到过的面试题】 rpm包
- 【那些年遇到过的面试题】 explicit关键字
- 【那些年遇到过的面试题】switch case default
- 【那些年遇到过的面试题】并发服务器模型
- 【那些年遇到过的面试题】gdb调试多线程
- 【那些年遇到过的面试题】tcpdump
- 【那些年遇到过的面试题】 内存泄露
- 【那些年遇到过的面试题】malloc 原理
- 【那些年遇到过的面试题】linux 内核锁
- 【那些年遇到过的面试题】select poll epoll
- 【那些年遇到过的面试题】select 函数
- 【那些年遇到过的面试题】 epoll
- 【那些年遇到过的面试题】线程安全
- 【那些年遇到过的面试题】pthread_cancel
- Sybase修改字符集
- Light oj 1202 - Bishops
- 碰到的一个关于GregorianCalendar类的问题
- Ubuntu 14.04环境变量修改
- errno(3) 线程局部变量
- 【那些年遇到过的面试题】单例和静态类
- Android Studio异常:Fatal signal 11 (SIGSEGV) at 0x000000b4 (code=1)
- JUnit 4.8 源码解读2
- numberOfLeadingZeros(int i)源码探索
- kafka文档(3)---- 配置选项翻译
- 分类模型的性能评估——以SAS Logistic回归为例
- php判断一个参数在一个数组中是否存在
- ubantu16.04和win8.1双系统的时间差问题
- 为什么谷歌要执行严格的代码编写规范