单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
//关于单例模式的多种方法。
#pragma once
#include <stdio.h>
#include <thread>
#include <mutex>
//方法-:单纯的在实例不存在的时候创建实例,无多线程机制。
class Singleton1
{
public:
Singleton1(){ }
~Singleton1(){}
static Singleton1 *GetSingleton()
{
if(s1 == NULL)
s1 = new Singleton1();
return s1;
}
static Singleton1 *s1;
};
Singleton1 *Singleton1::s1 = NULL;
//在方法1的基础上加上了多线程机制,可是效率较低,无论实例是否创建线程间都要考虑互斥量并同时进行枷锁解锁操作。
std::mutex m_lock2; //互斥量,用来同步线程
class Singleton2
{
public:
Singleton2(){}
~Singleton2(){}
static Singleton2 *GetSingleton()
{
m_lock2.lock(); //加锁
if(s2 == NULL)
s2 = new Singleton2();
m_lock2.unlock();//解锁
return s2;
}
static Singleton2 *s2;
};
Singleton2 *Singleton2::s2 = NULL;
//在方法2的方法上曾加效率,在实例已经创建了则根本没有多线程机制的干扰,此时就无须枷锁
std::mutex m_lock3; //互斥量,用来同步线程
class Singleton3
{
public:
Singleton3(){}
~Singleton3(){}
static Singleton3 *GetSingleton()
{
if(s3 == NULL)
{
m_lock3.lock(); //加锁
s3 = new Singleton3();
m_lock3.unlock();//解锁
}
return s3;
}
static Singleton3 *s3;
};
Singleton3 *Singleton3::s3 = NULL;
//方法4.---此种方法的缺点就是实例在类编译器就已经生成。假如不需要的话会造成资源浪费,空间拥挤。
class Singleton4
{
public:
Singleton4(){}
~Singleton4(){}
static Singleton4 *GetSingleton()
{
return s4;
}
static Singleton4 *s4;
};
Singleton4 *Singleton4::s4 = new Singleton4();
//方法5,主要改进方法4的实例化太随便。在需要时候才进行实例化。
//这里在单例类中嵌套了一个控制类,通过嵌套类的唯一一次构造来进行唯一一次的对单例的实例化。
class Singleton5
{
public:
Singleton5(){}
~Singleton5(){}
static Singleton5 *GetSingleton()
{
if(n == NULL)
n = new Nested();
return Nested::s5;
}
class Nested
{
friend class Singleton5;
Nested()
{
s5 = new Singleton5();
}
~Nested(){}
static Singleton5 *s5;
};
static Nested *n;
};
Singleton5 *Singleton5::Nested::s5 = NULL; //类的静态数据成员必须在类的声明后或者类的cpp文件中初始化
Singleton5::Nested *Singleton5::n = NULL;