一、简介
1、单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2、C++设计一个单例模式的方法如下:
(1)构造函数声明为私有; 这样就保证了不能随意构造一个对象。
(2) 将拷贝构造函数与等号运算符声明为私有,并不提供他们的实现; 即禁止对象被拷贝。
(3) 在类中声明一个静态的全局访问接口;用来创建对象的接口函数。
(4) 声明一个静态的私有实例化指针;将创建的对象保存在此,若已经创建则直接调用,否则创建新的。
3、UML
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();了