首页 > 技术文章 > 单例模式

goul 2018-12-06 20:43 原文

单例模式在企业中运用的很广也是很重要的一种模式。

1、要想明白单例模式,首先需要知道static关键字在C++中的含义

   小博,这边简要介绍一点:1、在C++中static修饰成员函数时,此函数能被本类的所有对象共享,只能出现一份,可以看做是全局函数

               2、在C++中static修饰成员变量时,此变量只能在类中声明,类外定义,并且此变量只能被初始化一次

了解了static对于函数和变量的两个特性后,不难想到单例模式的组成。简单来讲,就是使用static实例化一次对象即可

单例模式有两种简单的实现方式一个是懒汉模式,一个是饿汉模式

普通的懒汉模式:
头文件名字为:a.h
#ifdef A_H
#define A_H
class
A{ publicstatic 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()函数。

企业级的单例模式,考虑到单例实例化的时候可能存在多个线程执行,存在并发性的想象,因此会加上锁,防止并发性的发生。这种方式叫做“双重同步锁”    

推荐阅读