一.单例模式
一个类只能创建一个对象 ,这样的类的设计模式就称为单例模式,该模式保证系统中 该类只能有一个实例 (并且父子进程共享 ),一个很典型的单例类就是C++STL的内存池 C++单例模式的基本设计思路: 私有化构造函数 ,删除默认的拷贝构造函数 和赋值运算符重载 防止对象被直接创建和拷贝 单例对象的内存资源可以交给操作系统来释放,也可以自定义析构函数来完成特殊操作
二.单例模式的两种实现方式
饿汉模式
class HungerSingleton
{
public : static HungerSingleton* Getinstance ( ) { return & singleObj; }
private : HungerSingleton ( ) { cout << "单例对象创建" << endl; } HungerSingleton ( const HungerSingleton& single) = delete ; HungerSingleton& operator = ( const HungerSingleton& single) = delete ; private : static HungerSingleton singleObj;
} ;
HungerSingleton HungerSingleton:: singleObj;
HungerSingleton
的静态成员变量 是自身类型的对象(或指针) ,类的静态成员变量 在进入主函数之前就完成初始化,由于构造函数被私有化,因此在程序运行过程中无法再创建该类的对象饿汉单例模式的优势: 由于子进程只能在主函数中被创建 ,因此饿汉单例类不存在线程安全问题 ,无需与其他线程的类竞争系统资源,在多线程高并发环境下 能够较为高效地执行任务 饿汉单例模式的劣势: 如果一个程序中有多种饿汉单例类,我们无法控制它们的初始化顺序 饿汉单例类会拖慢程序的启动速度,而且即便用不到该类也会创建一个实例,可能造成内存浪费
懒汉模式
懒汉单例类在程序进入主函数之后 由后续代码决定是否创建实例
class LazySingleton
{
public : static LazySingleton* Getinstance ( ) { if ( singleObj == nullptr ) { singleObj = new LazySingleton; } return singleObj; }
private : LazySingleton ( ) { cout << "单例对象创建" << endl; } LazySingleton ( const LazySingleton& single) = delete ; LazySingleton& operator = ( const LazySingleton& single) = delete ; private : static LazySingleton* singleObj;
} ;
LazySingleton * LazySingleton:: singleObj = nullptr ;
LazySingleton
类在第一次调用Getinstance()
成员接口时才会创建实例懒汉单例模式的优势: 可以控制多种懒汉单例类对象的初始化顺序 ,并且需要用到的时候才创建,避免了内存浪费 懒汉单例模式的劣势: 在多线程环境中存在线程安全问题,需要加锁