单例模式

来源:互联网 发布:mysql 查询一年内 编辑:程序博客网 时间:2024/06/05 17:59

意图: 使类的对象成为系统中唯一的实例

实现分析:

       1. 任何new 的过程得到的 对象都是一样的, 即 :

Object *m_obj1 = new Object();

Object *m_obj2 = new Object();

如果采用这种方式,则 m_obj1 != m_obj2, 即不能采用这种创建对象的方式。

       2. 类中的static 变量在整个类,所有对象中都有效,所以采用 对象的静态成员指针来实现,所以首先声明一个静态指针: 

static Object * _instance;
      3. 需实例化 _instance, 并且在实例化之前不需要创建类的实例,所以必须创建一个静态成员函数(静态函数只需要模拟一个this指针即可, 同类的成员函数一样具有访问private变量和函数的功能),即:

static Object * Instance();Object *m_obj1 = Object.Instance();Object *m_obj2 = Object.Instance();
  m_obj1 == m_obj2 // 内存中的位置和数据一致
例子如下:
#ifndef SINGLE_TON_H#define SINGLE_TON_H//define singleton classclass Singleton{public:static Singleton * Instance();Singleton * Instance1();protected:Singleton();private:static Singleton* _instance; // global unique object for user reference};#endif#include <stdio.h>#include "singleton.h"Singleton* Singleton::_instance = NULL;Singleton::Singleton(){printf("This is singleton protected construct function\n");}Singleton* Singleton::Instance(){if (_instance == NULL ){_instance = new Singleton(); }return _instance;}Singleton * Singleton::Instance1(){if (_instance == NULL ){_instance = new Singleton(); }return _instance;}int main(){Singleton *sng = Singleton::Instance();Singleton *sng1 = Singleton::Instance();if ( sng1 == sng ){printf("sng == sng1 \n");}return 0;}