首页 > 代码库 > 单例模式

单例模式

一、简介

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

2、C++设计一个单例模式的方法如下:

        (1)构造函数声明为私有;   这样就保证了不能随意构造一个对象。

        (2) 将拷贝构造函数与等号运算符声明为私有,并不提供他们的实现; 即禁止对象被拷贝。

        (3) 在类中声明一个静态的全局访问接口;用来创建对象的接口函数。

        (4) 声明一个静态的私有实例化指针;将创建的对象保存在此,若已经创建则直接调用,否则创建新的。

二、C++程序

 

 1 // 单例模式.cpp : 定义控制台应用程序的入口点。 2 // 3  4 #include "stdafx.h" 5 #include<iostream> 6 using namespace std; 7 class Singleton  8 { 9 private:10     Singleton()//构造函数一定要声明为私有的11     {12         cout<<"构造了一个singleton对象"<<endl;13     }14     static Singleton *instance;//静态的,为所有对象所共有15 public:16     static Singleton * getinstance()17     {18         if(NULL==instance)19         {20             instance =new Singleton();21         }22         return instance;23     }24     Singleton(const Singleton& ){}25     Singleton & operator=(const Singleton & ){}26 27     ~Singleton()  28     {  29     }  30 };31 32 Singleton * Singleton::instance; //静态变量的定义性声明33 34 int _tmain(int argc, _TCHAR* argv[])35 {36     Singleton *s1=Singleton::getinstance();37     Singleton *s2=Singleton::getinstance();38     Singleton *s3=Singleton::getinstance();39     return 0;40 }

上述程序中s1、s2、s3用了三次对象,但是其实只调用了一次构造函数,也可以通过地址看出。
当然这样写有一个缺点是instance中申请的内存空间始终不会被释放的,解决办法可以看这个老兄的博客http://blog.csdn.net/ab198604/article/details/19196315

另外注意:类声明中只描述如何分配内存,但是并不真正分配内存。所以静态变量要类之外定义(定义是分配内存的)后才能够使用,所以要在程序的第32写

Singleton * Singleton::instance; 否则的话,instance都没有内存当然是没有办法存储new Singleton();了

 

单例模式