目录
编辑
一,单例模式介绍
二,单例模式下的两种模式
1,饿汉模式
2,懒汉模式
一,单例模式介绍
单例:在全局只有一份实例。
单例模式是编程的经典模式之一。
二,单例模式下的两种模式
1,饿汉模式
饿汉模式:在main函数启动前就先把实例化的类对象准备好。
1,提前准备好实例化对象:要使用全局变量。
2,保证全局只有一个实例化对象:要将构造函数,拷贝构造函数,赋值重载函数私有化防止类外面访问。
3,一个对象要是全局的又要能访问类里面的私有化方法:要在类里面声明一个static对象,在类外面定义。
代码示例:
class Singleton
{
public:
static Singleton*Get()//定义一个函数来调用这个对象。
{
return &member;
}
void change(int x)//改变成员_a值的函数
{
member._a = x;
}
int val()//返回一个成员_a值
{
return member._a;
}
private:
//构造函数私有化,赋值重载禁用
Singleton() {};
Singleton(const Singleton& aa)=delete;
Singleton& operator=(Singleton) = delete;
int _a = 0;
static Singleton member;//在类里面声明一个static成员。
};
Singleton Singleton::member;//类外定义
以上的饿汉模式的代码示例,现在来讲一讲饿汉模式的优缺点:
优点:1,设计简单。
缺点:1,会导致程序启动慢 2,当单例模式的类实例有顺序时,顺序不可控
2,懒汉模式
懒汉模式:第一次使用时再创建。并且要解决饿汉模式的缺点。
1,提前准备好实例化对象:要使用全局变量。但是又要改掉饿汉模式下的启动慢的问题,所以要将饿汉模式下的全局对象改成一个全局指针。
2,保证全局只有一个实例化对象:要将构造函数,拷贝构造函数,赋值重载函数私有化防止类外面访问。
3,一个对象要是全局的又要能访问类里面的私有化方法:要在类里面声明一个static指针,在类外面定义。
示例代码:
class Singleton2
{
public:
static Singleton2* Get()//定义一个函数来调用这个对象
{
if (member2 == nullptr) return member2 = new Singleton2;//第一次使用时创建
else return member2;
}
void change(int x)//改变成员_a值的函数
{
member2->_a = x;
}
int val()//返回一个成员_a值
{
return member2->_a;
}
private:
//构造函数私有化,赋值重载禁用
Singleton2() {};
Singleton2(const Singleton& aa) = delete;
Singleton2& operator=(Singleton) = delete;
int _a = 0;
static Singleton2* member2 ;//在类里面声明一个static成员。
};
Singleton2* Singleton2::member2 = nullptr;//类外定义初始化为nullptr
以上便是懒汉模式的示例代码。懒汉模式的优缺点如下:
优点:
1,解决了饿汉模式的缺点。
缺点:
1,具有线程安全的问题。(这个我还不太懂,以后补充)。