网站开发难不难学,哈尔滨模板建站系统,网站在线支付接口申请,设计图片欣赏单例模式
单例模式的概念
单例模式是一种对象创建型模式#xff0c;使用单例模式#xff0c;可以保证为一个类只生成唯一的实例对象。也就是说#xff0c;在整个程序空间中#xff0c;该类只存在一个实例对象。 GoF 对单例模式的定义是#xff1a;保证一个类、只有一个实…单例模式
单例模式的概念
单例模式是一种对象创建型模式使用单例模式可以保证为一个类只生成唯一的实例对象。也就是说在整个程序空间中该类只存在一个实例对象。 GoF 对单例模式的定义是保证一个类、只有一个实例存在同时提供能对该实例加以访问的全局访问方法。
为什么适用单例模式
在应用系统开发中我们常常有以下需求
在多个线程之间比如初始化一次 socket 资源比如 servlet 环境共享同一个资源或者 操作同一个对象在整个程序空间使用全局变量共享资源大规模系统中为了性能的考虑需要节省对象的创建时间等等。
实现单例步骤常用步骤
构造函数私有化提供一个全局的静态方法全局访问点在类中定义一个静态指针指向本类的变量的静态变量指针
懒汉式实现
如果单例对象构造十分耗时或者占用很多资源比如加载插件啊 初始化网络连接啊读取文件啊等等而有可能该对象程序运行时不会用到那么也要在程序一开始就进行初始化就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式延迟加载更好。
//懒汉式需要才创建
class Singleton_lazy{
private:Singleton_lazy(){}//防拷贝Singleton_lazy(Singleton const);Singleton_lazy operator(Singleton const);
public:static Singleton_lazy *getInstace() //提供方法获取{if(nullptr pSingleton) //其它线程看到指针不为空说明已创建直接用,不需要再等待{m_mtx.lock(); //加锁保证线程安全if (pSingleton NULL){pSingleton new Singleton_lazy;//new有可能失败抛出异常造成死锁}m_mtx.unlock();return pSingleton;}}//内嵌垃圾回收类 RAII的思想class Garbo{~Garbo(){if (pSingleton ! NULL){delete pSingleton;}}};
private:static Singleton_lazy * pSingleton;//类外初始化好static mutex m_mtx; //互斥锁
};
//类外初始化
volatile Singleton_lazy * Singleton_lazy::pSingleton NULL;
Singleton_lazy ::CGarbo Garbo;
mutex Singleton::m_mtx;编译器有可能进行优化:指令的重排 可以加上volatile
本来的顺序
申请空间构造对象赋值
优化的顺序
申请空间赋值构造对象
饿汉式实现
就是说不管你将来用不用程序启动时就创建一个唯一的实例对象。 //饿汉式,比较着急class Singleton_hungry{private:Singleton_hungry(){}//防止拷贝Singleton_hungry(Singleton const);Singleton_hungry operator(Singleton const);public:static Singleton_hungry *getInstace(){return pSingleton;}//实现内嵌垃圾回收类#if 0class Garbo{~Garbo(){if (pSingleton ! NULL){delete pSingleton;}}};#endifprivate:static Singleton_hungry * pSingleton;};Singleton_hungry * Singleton_hungry::pSingleton new Singleton_hungry;线程安全
饿汉式是线程安全的在main函数前创建对象懒汉式不是线程安全的