标签:操作 访问 变量 return 方式 编译 程序 ++ 分配
一、单利模式:就是只有一个实例。
singleton pattern单例模式:确保某一个类在程序运行中只能生产一个实例,并提供一个访问它的全局访问点。这个类称为单例类。如一个工程中,数据库访问对象只有一个,电脑的鼠标只能连接一个,操作系统只能有一个窗口管理器,这是可以考虑使用单利模式。
众所周知,C++类中,类对象被创建时,编译系统为对象分配内存空间,并自动调用构造函数,由构造函数完成成员的初始话工作,也就是说使用构造函数来初始化对象。
1、那么我么需要把构造函数设置成私有的private,这样可以禁止别人使用构造函数创建其他的实例。
2、又单例类要一直向系统提供这个实例,那么,需要声明它为静态的实例成员,在需要的时候,才创建该实例。
3、且应该把这个静态成员设置为 null,在一个public 的方法里去判断,只有在静态实例成员为 null,也就是没有被初始化的时候,才去初始化它,且只被初始化一次。
二、代码示例
class Singleton(懒汉模式)
{
private:
Singleton(){}
static Singleton* singleton;
public:
static Singleton* getInstance(){
if(singleton == NULL)
singleton = new Singleton();
return singleton;
};
Singleton* Singleton::singleton = NULL;
class Singleton(饿汉模式)线程安全的,因为所有类共享一个静态变量的实例
{
private:
Singleton(){}
static Singleton* singleton;
public:
static Singleton* getInstance(){
return singleton;
};
Singleton* Singleton::singleton = new Singleton();
这是一个很棒的实现,简单易懂。但是这是一个完美的实现吗?不!该方法是线程不安全的。考虑两个线程同时首次调用instance方法且同时检测到p是NULL值,则两个线程会同时构造一个实例p,这是严重的错误!同时,这也是不是单例的唯一实现!
三、懒汉与饿汉
单例模式大约有两种实现方式:懒汉与饿汉
懒汉:顾名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才回
去实例化,所以上面的经典方法被归为懒汉实现,以时间换空间。
饿汉:饿了肯定要饥不择食。所以单例类定义的时候就进行实例化,以空间换时间。
四、线程安全的懒汉实现
加锁的经典懒汉实现:
class singleton
{
private:
singleton(){
pthread_mutex_init(&mutex);
}
static singleton *p;
public:
static pthread_mutex_t mutex;
static singleton *initance();
}
singleton* singleton::p = NULL;
singleton* singleton::initance() { if (p == NULL) { pthread_mutex_lock(&mutex); if (p == NULL) p = new singleton(); pthread_mutex_unlock(&mutex); } return p; }
程序设计模式之单例模式
标签:操作 访问 变量 return 方式 编译 程序 ++ 分配
原文地址:http://www.cnblogs.com/mjbjtunlp/p/6592872.html