1 何为单例模式
单例模式专业英文术语称之为 singleton,单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。更通俗一点的解释就是:如果一个类始终只能创建一个实例,则这个类被称为单例类,这种模式就被称为单例模式。
2 优点和缺点
优点: 确保所有对象都只访问唯一的实例
缺点: 对象的生存周期
3 在哪些情况下使用单例模式
<1> 加载配置文件的时候,可以使用单例模式
<2> 比如说某个类里面的接口在很多文件或者模块中会用到,这个时候我们就可以使用单例模式,这样的好处就是不用再每个需要调用的地方去实例化这个对象。
4 如何写单例模式
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
</pre><pre name="code" class="cpp">class CSingleton
{
private:
// <span style="color: rgb(51, 51, 51); font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">一是单例模式的类只提供私有的构造函数</span>
CSingleton() //构造函数是私有的
{
}
public:
<span style="color: rgb(51, 51, 51); font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">// 三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。</span>
static CSingleton * GetInstance()
{
static CSingleton *m_pInstance; //<span style="color: rgb(51, 51, 51); font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">二是类定义中含有一个该类的静态私有对象</span>
if(m_pInstance == NULL) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
};
5 代码实例
//.h文件
#pragma once
#include "stdafx.h"
class AppServiceSignal
{
private:
AppServiceSignal();
~AppServiceSignal();
public:
static AppServiceSignal* GetInstance();
void Add(int x,int y);
void Sub(int x, int y);
};
//.cpp 文件
#include "stdafx.h"
#include"AppService.h"
#include<iostream>
using namespace std;
AppServiceSignal::AppServiceSignal()
{
}
AppServiceSignal::~AppServiceSignal()
{
}
AppServiceSignal* AppServiceSignal::GetInstance()
{
static AppServiceSignal *m_Instance;
if(m_Instance == nullptr)
{
m_Instance = new AppServiceSignal();
}
return m_Instance;
}
void AppServiceSignal::Add(int x,int y)
{
cout<<x<<" + "<<y<<" = "<<x+y<<endl;
}
void AppServiceSignal::Sub(int x,int y)
{
cout<<x<<" - "<<y<<" = "<<x-y<<endl;
}
//测试文件
#include "stdafx.h"
#include<iostream>
#include"AppService.h"
int _tmain(int argc, _TCHAR* argv[])
{
AppServiceSignal::GetInstance()->Add(3,5);
AppServiceSignal::GetInstance()->Sub(3,5);
system("pause");
return 0;
}