示例问题:
一个程序中,有一个管理类,这个管理类,只想实例化一个对象,且要保证这个类只有一个实例化对象。
分析:
全局变量不能解决该问题,全局变量不能防止一个类实例化多个对象。
解决方案:
Singleton.h
单例类的实现
该类的构造函数和析构函数声明为私有的(为了防止除了提供该类的全局访问点外的其他方法创建该类的对象)
该单例模式的实现,是利用static关键字的特性。即static声明的变量,第一次初始化分配内存后,就算函数或者代码块执行完毕,该变量也不会被回收、销毁(在程序退出后,才回被回收销毁);且之后再访问该变量,该变量的内存地址也不会变(内存地址在静态存储区)。
#pragma once
class CSingleton
{
private:
CSingleton()
: m_iCount(0)
{
}
virtual ~CSingleton()
{
}
int m_iCount;
public:
static CSingleton* GetInstance()
{
static CSingleton inst;
return &inst;
}
void CountAdd(int iNum)
{
m_iCount += iNum;
}
int GetCountNum()
{
return m_iCount;
}
};
main.cpp
// main.cpp : 定义控制台应用程序的入口点。
//
#include "Singleton.h"
#include <iostream>
int main()
{
CSingleton::GetInstance()->CountAdd(3);
std::cout << "地址:" << CSingleton::GetInstance() << std::endl;
std::cout << "计数:" << CSingleton::GetInstance()->GetCountNum() << std::endl;
CSingleton::GetInstance()->CountAdd(90);
std::cout << "地址:" << CSingleton::GetInstance() << std::endl;
std::cout << "计数:" << CSingleton::GetInstance()->GetCountNum() << std::endl;
system("pause");
return 0;
}
程序执行结果:
可见两次访问单例类的对象为同一地址。
单例模式的使用:
单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
何时使用单例模式:
通常我们可以让一个全局变量是的一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
返回目录:设计模式(C++实现)(总)
上一篇:设计模式(C++实现)(一)——设计模式总原则及六大原则