• C++设计模式-Singleton


    Singleton单例模式

    Singleton 是对全局变量的取代策略
    作用:保证一个类只能有一个实例,并提供一个全局唯一的访问点。

    仅有一个实例:通过类的静态成员变量来体现。
    提供访问它的全局访问点:访问静态成员变量的静态成员函数来体现。

    《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。

    单例模式通过类本身来管理其唯一实例,这种特性提供了解决问题的方法。唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。唯一实例类Singleton在静态成员函数中隐藏创建实例的操作。习惯上把这个成员函数叫做Instance(),它的返回值是唯一实例的指针。

    单例类Singleton有以下特征:

    它有一个指向唯一实例的静态指针,并且是私有的;

    它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;

    它的构造函数是私有的,这样就不能从别处创建该类的实例。

    UML图:

    在Singleton模式的结构图中可以看到,我们通过维护一个static的成员变量_instance来记录这个唯一的对象实例。通过提供一个staitc的接口Instance来获得这个唯一的实例。

    代码如下:

    Singleton.h

     1 #ifndef _SINGLETON_H_
     2 #define _SINGLETON_H_
     3 
     4 class Singleton
     5 {
     6 private:
     7     static Singleton* pInstance;//静态成员,保存对象的唯一实例
     8     Singleton();//私有化构造函数,使其无法在类外实例化
     9 public:
    10     static Singleton* Instance();
    11     //void Destroy();
    12     static void Destroy();
    13 };
    14 
    15 #endif

    Singleton.cpp

     1 #include "Singleton.h"
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 Singleton* Singleton::pInstance = NULL;
     7 
     8 Singleton::Singleton()
     9 {
    10     cout<< "Singleton..." << endl;
    11 }
    12 
    13 Singleton* Singleton::Instance()
    14 {
    15     if(NULL == pInstance)
    16     {
    17         pInstance = new Singleton();
    18     }
    19     return pInstance;
    20 }
    21 
    22 void Singleton::Destroy()
    23 {
    24     delete pInstance;
    25     pInstance = NULL;
    26     cout<< "Destroy..." << endl;
    27 }

    main.cpp

     1 #include "Singleton.h"
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     Singleton* ps = Singleton::Instance();//通过全局访问点获取实例
     9     Singleton::Destroy();
    10     return 0;
    11 }

    Singleton不可以被实例化,因此我们将其构造函数声明为protected或者直接声明为private。

  • 相关阅读:
    Java基础学习(五) String类
    Java基础学习(四) java8线程
    Java基础学习(三) IO
    Java基础学习(二) 集合
    Java基础学习(一) 基本数据类型和引用数据类型
    枚举类常见漏洞解决
    数据校验
    postman如何传递token进行接口测试
    Spring Cloud-OpenFegin
    SpringCloud-Eureka
  • 原文地址:https://www.cnblogs.com/jiese/p/3158517.html
Copyright © 2020-2023  润新知