1. 前言
设计模式描述了对象如何进行通信才能不牵涉相互的数据模型和方法。
保持这种独立性一直是一个好的面向对象程序设计的目标。
Gang of Four 的 "Design Patterns: Elements of Resualbel Sofware" 书将设计模式归纳为三大类类型,共 23 种。
- 创建型模式:通常和对象的创建有关,涉及到对象实例化的方式。(共 5 种模式)
- 行为型模式:通常和对象间通信有关。(共 11 种模式)
- 结构型模式:描述的是如何组合类和对象以获得更大的结构。(共 7 种模式)
类模式描述的是如何使用继承提供更有用的程序接口。
而对象模式描述的是如何通过使用对象组合或将对象包含在其他对象里,将对象组合成更大的结构。
2. 综述
2.1 什么是单例模式
单例模式是一种对象创建型模式,使用单例模式,可以保证一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
其实,GoF 对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能该对类实例加以访问的全局访问方法。
单例模式(Singleton)结构图
2.2 为什么使用单例模式
在应用系统开发中,我们常常有以下需求:
- 在多个线程之间,比如初始化一次 socket 资源;比如 servlet 环境,共享同一个资源或者操作同一个对象
- 在整个程序空间中使用全局变量,共享资源
- 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等
因为 Singleton 模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton 模式就派生用场了。
3. 单例模式的实现
3.1 常用步骤
- 构造函数私有化
- 提供一个全局的静态方法(全局访问点)
- 在类中定义一个静态指针,指向本类的变量的静态变量指针
3.2 饿汉式
class Singelton
{
private:
/* 将类的构造函数私有化,以便不能随便调用类的构造函数 */
Singelton()
{
cout << "Singelton 构造函数 begin" << endl;
Sleep(1000);
}
public:
/* 提供一个全局的访问点 */
static Singelton *getSingelton()
{
/* 每一个 getSingelton 的时候,都需要判断 single 是否存在 */
if (single == NULL)
{
single = new Singelton();
}
return single;
}
static Singelton *releaseSingelton()
{
if (single != NULL) // 需要判断
{
delete single;
single = NULL;
}
return single;
}
void printS() // 测试函数
{
cout << "Singelton printS test" << endl;
}
private:
static Singelton *single;
};
// note: 静态变量类外初始化
Singelton *Singelton::single = NULL;
void main()
{
Singelton *sl = Singelton::getSingelton();
Singelton *s2 = Singelton::getSingelton();
if (s1 == s2)
{
cout << "ok ... equal" << endl;
}
cout << "hello..." << endl;
system("pause");
}