zoukankan      html  css  js  c++  java
  • 单例模式

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

    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()函数。

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

  • 相关阅读:
    《NoSQL精粹》读书笔记
    react+flux编程实践(一) 基础篇
    MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引
    (译+注解)node.js的C++扩展入门
    深入解析Javascript异步编程
    (译)package.json详解
    Protobuf学习
    Redis学习
    MySQL学习-常用命令整理
    TCP/IP-TCP
  • 原文地址:https://www.cnblogs.com/goul/p/10079390.html
Copyright © 2011-2022 走看看