读书人

[设计方式]Singleton单例模式

发布时间: 2013-01-23 10:44:49 作者: rapoo

[设计模式]Singleton单例模式
singleton单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

[设计方式]Singleton单例模式

解析:

Singleton模式其实是对全局静态变量的一个取代策略,singleton模式的两个作用在C++中是通过如下的机制实现的:

1)仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对应类的所有对象而言是唯一的

2)提供一个访问他的全局访问点,也就是提供对应的访问这个静态成员变量的静态成员函数,对类的所有对象而言也是唯一的。

在C++中,可以直接使用类域进行访问而不必初始化一个类的对象。

小demo

singleton.h

#ifndef SINGLETON_H#define SINGLETON_H/*下面的实现其实是singleton的一个简单实现,并不是特别通用,一般的,如果一个项目中需要使用到singleton模式比较多的话,那么一般会实现一个singleton的模板类,模板类的模板参数是需要采用singleton模式的类,比如这样实现http://blog.csdn.net/ouyangshima/article/details/7651708template<typename T>class Singleton{//...。类的声明};//需要采用singleton模式的类class Test : pulic Singleton<Test>{//...。类的声明};*/class Singleton{private:Singleton(){};~Singleton(){};public:// 静态成员函数,提供全局访问的接口static Singleton* GetInstancePtr();static Singleton  GetInstance();void Test() ;private:// 静态成员变量,提供全局惟一的一个实例static Singleton* m_pStatic;};#endif

singleton.cpp

#include "Singleton.h"#include <iostream>// 类的静态成员变量要在类体外进行定义,需要在cpp文件进行赋值,若在.h文件中赋值,当多个文件都保护.h文件时会出现重定义。Singleton* Singleton::m_pStatic = NULL;Singleton* Singleton::GetInstancePtr(){if (NULL == m_pStatic){m_pStatic = new Singleton();}return m_pStatic;}Singleton Singleton::GetInstance(){return *GetInstancePtr();}void Singleton::Test(){std::cout << "Test!\n";}

main.cpp

#include "Singleton.h"#include <stdlib.h>#include <iostream>using namespace std;int main(){//Singleton* s2=&(Singleton::GetInstance());//无法访问private或protected成员// 不用初始化类对象就可以访问了Singleton* s1=Singleton::GetInstancePtr();s1->Test();Singleton* s2=Singleton::GetInstancePtr();if (s1==s2)std::cout<<"ok"<<std::endl;elsestd::cout<<"no"<<std::endl; system("pause");return 0;}

Sinleton模式经常哈Factory(AbstractFactory)模式在一起使用,因为系统中工厂对象一般来说只要一个,这里的工厂对象实现就是同事是一个Singleton模式的实例,因为系统我们就只要一个工厂来创建对象就可以了。

读书人网 >软件开发

热点推荐