单例模式的作用与目的
- 作用:保证了一个类仅有一个实例,并提供了一个访问它的全局访问点
- 目的:为了保证类的实例对象只有一个
- 主要解决:一个全局使用的类,频繁的创建于销毁
- 举例:例如在Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
- 何时使用:想控制实例数目,节省系统资源的时候
- 关键: 构造函数和拷贝构造私有化
实现方法
- 私有构造函数和拷贝构造函数 不让类的外部创建对象
- 静态类指针 在静态成员函数中实现只创建一个对象的逻辑
- 静态成员函数返回类指针 用来实例化(new)对象
代码实现
#include <iostream>
#include <string>
using namespace std;
class DBManager//这里单例模式必要的代码
{
private:
DBManager()
{}
DBManager(const DBManager& other)
{}
static DBManager* instance;
public:
static DBManager* getInstance()//创建DBManager对象的函数
{
//保证DBManeger对象只被创建一次
if(instance == 0)
{
instance = new DBManager;
}
return instance;
}
static void releaseInstance()//释放对象
{
delete instance;
instance = 0;
}
};
DBManager* DBManager::instance = 0;
int main()
{
//想创建DBManager对象,只有getInstance一种方式
DBManager* d1 = DBManager::getInstance();
DBManager* d2 = DBManager::getInstance();
DBManager* d3 = DBManager::getInstance();
DBManager* d4 = DBManager::getInstance();
DBManager* d5 = DBManager::getInstance();
DBManager* d6 = DBManager::getInstance();
//DBManager* d7 = new DBManager();//语法错误 因为私有化构造函数
//DBManager* d8 = new DBManager(*d1);//语法错误 因为私有化拷贝构造函数
cout<<d1<<" "<<d2<<" "<<d3<<" "<<d4<<" "<<d5<<" "<<d6<<endl;
return 0;
}