单例模式

在架构设计时,某些类在整个系统生命期最多只有一个对象存在,这个时候单例模式的需求就发展出来,那如何定义一个类,使得这个类最多只能创建一个对象呢,思路如下
1.将构造函数的访问属性设置为private(外界无法创建对象)
2.定义instance并初始化为NULL
3.当需要使用对象时,访问instance的值
空值:创建对象,并用instance标记
非空值:返回instance标记的对象

例子:

#include <iostream>
using namespace std;
class Object
{
   static Object * instance;
   Object()
   {
   
   }
   Object(const Object &obj)
   {
   
   }
   Object& operator = (const Object &obj)
   {
   
   }
   public:
   static  Object* GetInstance();
   void print()
   {
     cout<<"this = "<<this<<endl;
   }
};
Object* Object::instance = NULL;
Object* Object::GetInstance()
{
  if( instance == NULL)
  {
     instance = new Object();
  }
  return instance;
}
int main()
{  
  Object * obj  = Object::GetInstance();
  Object * obj1 = Object::GetInstance();
  Object * obj2 = Object::GetInstance();
  obj->print();
  obj1->print();
  obj2->print();
  return 0;
}

结果:

sice@sice:~$ ./a.out 
this = 0x8074008
this = 0x8074008
this = 0x8074008

可以看出Object类任何时刻只有一个对象存在,这就是单例模式,对于单例模式得到的对象在整个系统的运行过程当中是不用释放的,但是上面的实现也有它的缺陷的,多个单例类就需要多个静态成员变量和静态成员函数,我们可以将单例模式相关的代码抽取出来,开发单例类模板,当需要单例类时,直接使用单例类模板
例子:
test.h

#ifndef _TEST_H_
#define _TEST_H_
template <typename T>
class Single
{
  static T* instance;
  public:
  static T* GetInstance();
};
template <typename T>
T* Single<T>::instance = NULL;
template <typename T>
T* Single<T>::GetInstance()
{
  if(instance == NULL)
  {
     instance = new T();
  }
  return instance;
} 
#endif

test.c

#include <string>
#include <iostream>
#include "test.h"
using namespace std;
class Object
{  
   friend class Single<Object>;//定义友元关系使其能够访问Object的print函数
   Object()
   {
   
   }
   Object(const Object &obj);
   Object& operator = (const Object &obj);
   public:
   void print()
   {
     cout<<"this = "<<this<<endl;
   }
};
int main()
{  
  Object * obj  = Single<Object>::GetInstance();
  Object * obj1 = Single<Object>::GetInstance();
  Object * obj2 = Single<Object>::GetInstance();
  obj->print();
  obj1->print();
  obj2->print();
  return 0;
}

结果:
sice@sice:~$ ./a.out
this = 0x8d80008
this = 0x8d80008
this = 0x8d80008
总结:
单例模式是开发中最常用的设计模式之一
单例模式的应用使得一个类最多有一个对象
可以将单例模式相关的代码抽象成类模板
需要使用单例模式的类直接使用单例模板

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值