软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最学习设计模式,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍单例模式的实现。
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。
《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实。单例模式通过类本身来管理其唯一实例,这种特性提供了解决问题的方法。唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。唯一Singleton在静态成员函数中隐藏创建实例的操作。习惯上把这个成员函数叫做Instance(),它的返回值是唯一实例的指针。
定义如下:
class Singleton
{
private:
Singleton(); //私有构造方法
static Singleton* instance;//唯一实例
int var; //成员遍历(用于测试)
public:
static Singleton* getInstance(); //工程方法(用来获得实例)
int getVar(); //获取var值
void setVar(int); //设置var值
virtual ~Singleton();
};
用户访问唯一实例的方法只有GetInstance()成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。GetInstance()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。这是一种防弹设计——所有GetInstance()之后的调用都返回相同实例的指针.
单例类CSingleton有以下特征:
它有一个指向唯一实例的静态指针m_pInstance,并且是私有的;
它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;
它的构造函数是私有的,这样就不能从别处创建该类的实例。
#include "Singleton.h"
Singleton::Singleton()
{
this->var =20;
std::cout<<"Singleton Constructor\n";
}
Singleton::~Singleton()
{
std::cout<<"Singleton Destructor\2";
}
//初始化静态成员
Singleton* Singleton::instance =new Singleton;
//获取唯一实例
Singleton* Singleton::getInstance()
{
returninstance;
}
intSingleton::getVar()
{
return this->var;
}
voidSingleton:: setVar(int var)
{
this->var = var;
}
main函数测试如下:
首先引入该类的头文件:#include "Singleton.h"
int main(int argc,const char * argv[])
{
// insert code here...
std::cout <<"Hello, World!\n";
//测试创建两个对象
Singleton *ton1 = Singleton::getInstance();
Singleton *tou2 = Singleton::getInstance();
//判断对象实例是否是同意一个
if (ton1 == tou2)
{
std::cout<<"tou1 == tou2"<<std::endl;
}
//查看var值是否是一样的打印
std::cout<<"tou1 var = "<<ton1->getVar()<<std::endl;
std::cout<<"tou2 var = "<<tou2->getVar()<<std::endl;
//修改Var值
ton1->setVar(100);
//修改var值再次查看打印
std::cout<<"tou1 var = "<<ton1->getVar()<<std::endl;
std::cout<<"tou2 var = "<<tou2->getVar()<<std::endl;
//操作指针前先判断在操作
if (Singleton::getInstance())
{
//获取唯一实例释放
delete Singleton::getInstance();
}
return 0;
}
以上是C++ 单利模式小例子测试,如有问题请留言。