单例模式
单例模式在企业中运用的很广也是很重要的一种模式。
1、要想明白单例模式,首先需要知道static关键字在C++中的含义
小博,这边简要介绍一点:1、在C++中static修饰成员函数时,此函数能被本类的所有对象共享,只能出现一份,可以看做是全局函数
2、在C++中static修饰成员变量时,此变量只能在类中声明,类外定义,并且此变量只能被初始化一次
了解了static对于函数和变量的两个特性后,不难想到单例模式的组成。简单来讲,就是使用static实例化一次对象即可
单例模式有两种简单的实现方式一个是懒汉模式,一个是饿汉模式
普通的懒汉模式:
头文件名字为:a.h
#ifdef A_H
#define A_H
class A{ public: static A *instance();
int* setA();
private:
int a; A(int a = 0)(this->a = a){ } ~A(){ } //其他功能函数 void funA(); ..... } #endif //a.h
.cpp文件
#include “a.h” A* A::instance() { static A* g_A = nullptr; if (g_A == nullptr) { g_A = new A(); } } return g_A; }
int* A::setA()
{
return &a;
}
单例模式的性质:1、某个类只能有一个实例
2、他必须自行创建这个实例
3、它必须自行向整个系统提供
调用单例模式很简单,包含头文件,想使用全局变量一样使用就可以了
#include“a.h”
int main(int argc,char* argv[])
{
A::instance->setA() = 1;
}
可看到例子使用static函数提供一个全局接口,然后使用static实例化一个对象,是不是很简单。使用static函数来实例化一个对象,是为了保证保证一个实例对象的完整性,与类绑定在一块。
即实例化对象,并封装成静态成员函数调用
注意一点:返回值如果是一个指针的话,一般是为了链式调用
举个例子:当在一个类中定义一个结构体成员变量为私有属性的话,你如果想改变这个结构体中成员的变量,你可以写一个函数返回这个结构体的指针。
上图有例子就是setA()函数。
企业级的单例模式,考虑到单例实例化的时候可能存在多个线程执行,存在并发性的想象,因此会加上锁,防止并发性的发生。这种方式叫做“双重同步锁”