单例模式

  • 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。

  • 如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。

  • 一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。


一、模式定义


单例模式 : 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例(只要包含了该类头文件,那么整个系统将只有一个实例),这个类称为单例类,它提供全局访问的方法。

单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。

其UML图如下:

这里写图片描述

以下是简单的C++实现:

头文件:

// Singleton.h
class Singleton
{
private:
    Singleton(); // 防止外界利用new创建此类的可能

public: 
    static Singleton* getInstance();
    void singletonOperation();
};

实现:

//  Singleton.cpp
//  Implementation of the Class 
#include "Singleton.h"
#include <iostream>
#include <new> // std::nothrow

using namespace std;

Singleton * Singleton::instance = NULL;

Singleton::Singleton()
{}

Singleton::~Singleton()
{
   delete instance;
}

Singleton* Singleton::getInstance()
{
  if (instance == NULL)
  {
     instance = new (std::nothrow) Singleton();
  }
  return  instance;
}

void Singleton::singletonOperation()
{
    cout << "singletonOperation" << endl;
}

测试代码:

#include <iostream>
#include "Singleton.h"
using namespace std;
int main(int argc, char *argv[])
{
    Singleton * sg = Singleton::getInstance();
    sg->singletonOperation();
    return 0;
}

二、小结


单例模式是一种保证整个程序只有一个类实例的设计方法。应该提供接口用于获得实例对象(如getInstance),并且避免主动调用 new 来实例化对象。

注意,上述单例模式代码,并不是线程安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值