C++设计模式(一)单例模式

本文介绍了单例模式的概念,它确保一个类只有一个实例,并提供全局访问点。提供了一个C++实现的单例模式模板,通过模板可以方便地在不同场景下复用。代码示例展示了如何使用该模板创建一个单例类`Test`,并通过`main`函数验证了单例模式的效果,输出显示两个不同变量引用了同一对象。
摘要由CSDN通过智能技术生成

1、单例模式介绍

单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)。当然了,我们可以理解为,单例模式就是蝎子的尾巴,独一份。具体怎么独一份呢,就是说程序运行起来之后,单例的对象就只有一个,外部获取到的也是唯一的一个。
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

2、代码示例

接下来,我们就采用c++的模板设计一个单例模式的模板,此后再需要使用单例模式的地方,就直接继承这个模板,并且初始化TYPE就可以直接使用单例模式了,万一工程中有其他地方需要使用到单例模式,以此类推,直接继承并实现就可以,也不需要重复的造轮子。

#include <iostream>
#include <thread>         // std::thread
#include <mutex>          // std::mutex, std::lock_guard
std::mutex mtx;
using namespace std;
template <typename TYPE>
class  Singleton
{
public:
    static TYPE& getInstance() {
      TYPE* instance = mInstance;
      std::lock_guard<std::mutex> lck (mtx);
      if (instance == 0) {
          instance = new TYPE();
          mInstance = instance;
      }
      return *mInstance;
    }
    static bool hasInstance() {
      std::lock_guard<std::mutex> lck (mtx);
      return mInstance != 0;
    }
protected:
    ~Singleton() { }
    Singleton() { }
private:
    Singleton(const Singleton&);
    Singleton& operator = (const Singleton&);
    static TYPE* mInstance;
};

template <typename TYPE>
TYPE* Singleton<TYPE>::mInstance = NULL;

/

上面是单例模式模板类的源码,下面我们来应用下这个模板,具体代码如下所示:

#include <iostream>
#include <thread>         // std::thread
#include <mutex>          // std::mutex, std::lock_guard

using namespace std;

std::mutex mtx;
/************************************************************************
 * 文件说明
 * 单例模式示例
*************************************************************************/
template <typename TYPE>
class  Singleton
{
public:
    static TYPE& getInstance() {
      TYPE* instance = mInstance;
      std::lock_guard<std::mutex> lck (mtx);
      if (instance == 0) {
          instance = new TYPE();
          mInstance = instance;
      }
      return *mInstance;
    }
    static bool hasInstance() {
      std::lock_guard<std::mutex> lck (mtx);
      return mInstance != 0;
    }
protected:
    ~Singleton() { }
    Singleton() { }
private:
    Singleton(const Singleton&);
    Singleton& operator = (const Singleton&);
    static TYPE* mInstance;
};

template <typename TYPE>
TYPE* Singleton<TYPE>::mInstance = NULL;

/
// Test

class Test : public Singleton <Test>
{
public:
  Test() { mCreateNum++;};
  void printCreateNum(void) { std::cout << "CreatMum:" << mCreateNum << endl; }
private:
  int mCreateNum = 0;
};

int main(int agc,char *argv[])
{

  class Test *test1 = &Test::getInstance();
  class Test *test2 = &Test::getInstance();

  test1->printCreateNum();
  test2->printCreateNum();
  std::cout << "Test = "<< test1 << std::endl;
  std::cout << "Test = "<< test2 << std::endl;
  return 0;
}
///
//Out
//CreatMum:1
//CreatMum:1
//Test = 0x665c20
//Test = 0x665c20

从上面的打印,我们可以看到,test1和test2都是指向的同一个对象,所以使用单例模式成功。

3、总结

单例模式是设计模式中最简单的一个模式,使用单例模式的模板,以后可以直接继承,避免重复造轮子。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给大佬递杯卡布奇诺

你们的鼓励就是我传作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值