单例函数的创建 c语言,c++中的单例类模板的实现方法详解

本文详细介绍了C++中单例模式的概念和实现方式,包括私有构造函数、静态成员变量和静态成员函数的使用。通过一个具体的SObject类示例,展示了如何创建和使用单例对象。进一步,提出了使用类模板优化单例模式的实现,减少代码冗余,提高代码复用性。文章最后给出了基于类模板的单例模式实现案例。
摘要由CSDN通过智能技术生成

1、什么是单例模式

在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在 ( Single Instance )。如超市收银系统,其外观主要由显示器(1个)、扫描枪(1个)、收款箱(1个)组成,在系统正常运行期间这三部分都是唯一存在的;也就是说,显示器、扫描枪、收款箱这三部分都应该有各自的类,并且每个类只能唯一地实例化一个对象,基于这种模式的程序设计,称为单例模式。

!!!单例模式只能创建一个对象,且该对象的生命周期伴随系统的整个运行期间。

2、怎么实现单例模式

思考:如何定义一个类,使得这个类最多只能创建一个对象?

分析:因为对象是由构造函数创建的,所以我们应该将问题锁定在构造函数上;又因为只能创建一个对象,这就意味着只能调用一次构造函数;显然将构造函数的访问权限设置为 public 不合适,所以,构造函数的访问权限只能是 private。然后,定义一个私有的静态成员 c_instance = NULL 和 公有的静态成员函数,通过  c_instance 来判断是否创建对象。(这个为什么要使用 静态成员呢?因为构造函数是私有的,在类的外部无法创建对象,只能通过类名调用静态成员,而静态成员函数只能调用静态成员变量)

上述分析过程可简化为:

(1)将构造函数的访问属性设置为 private;

(2)定义私有的静态成员属性 instance 并初始化为 NULL;

(3)当需要使用对象时,访问 instance 的值;

1)空值:创建对象,并用 instance 标记;

2)非空值:返回 instance 标记的对象;

单例模式实现

#include

#include

using namespace std;

class SObject

{

static SObject* c_instance; // 定义标识符指针;

/* 不需用拷贝和赋值,在单例模式中,始终只有一个对象 */

SObject(const SObject&);

SObject& operator= (const SObject&);

SObject() // 私有的构造函数

{

}

public:

static SObject* GetInstance(); // 创建对象的入口

void print()

{

cout << "this = " << this << endl;

}

};

SObject* SObject::c_instance = NULL; // 静态成员类内声明,类外定义

SObject* SObject::GetInstance() // 单例模式的关键

{

if( c_instance == NULL )

{

c_instance = new SObject();

}

return c_instance;

}

int main()

{

SObject* s = SObject::GetInstance();

SObject* s1 = SObject::GetInstance();

SObject* s2 = SObject::GetInstance();

s->print(); // this = 0x940a008

s1->print(); // this = 0x940a008

s2->print(); // this = 0x940a008

return 0;

}

// 注:单例模式中,对象的生命周期存在整个系统运行过程中,所以是绝对不释放的;

·   其实,在上述的单例模式实现案列中,有一部分代码(分析过程中第2、3步)与类本身没有任何关系,既然是这样,我们就把这部分单独提取出来处理。

问题所在:需要使用单例模式时,必须在每个类中定义 静态成员变量 c_instance 和 静态成员函数 GetInstance();当有多个类都需要使用单例模式时,这样的实现方式明显的很冗余,为了能够代码复用,我们可以 将这两部分抽象成一个新类(做成类模板,声明为其它类的友元类,这样与之前的效果一样)。

基于类模板的单例模式实现

// 对上个单例模式实现代码的改进

// singleton.hpp 单例模式代码

#ifndef SINGLETON_H

#define SINGLETON_H

template

< typename T >

class Singleton

{

static T* c_instance;

public:

static T* GetInstance();

};

template

< typename T >

T* Singleton::c_instance = NULL;

template

< typename T >

T* Singleton::GetInstance()

{

if( c_instance == NULL )

{

c_instance = new T();

}

return c_instance;

}

#endif

// main.cpp 测试文件

#include

#include

#include "singleton.hpp"

using namespace std;

class SObject

{

friend class Singleton; // 当前类需要使用单例模式

SObject(const SObject&);

SObject& operator= (const SObject&);

SObject()

{

}

public:

void print()

{

cout << "this = " << this << endl;

}

};

int main()

{

SObject* s = Singleton::GetInstance();

SObject* s1 = Singleton::GetInstance();

SObject* s2 = Singleton::GetInstance();

s->print(); // 0xe63c20

s1->print(); // 0xe63c20

s2->print(); // 0xe63c20

return 0;

}

在今后工作中,如果一个类(SObject)要使用单例模式(Singleton 单例模式的类模板),只需三步骤:

(1)类(SObject)的构造函数必须私有化;同时,拷贝构造函数、重载=操作符 也私有化;

(2)将单例模式的类模板声明为这个类的友元类; friend class Singleton;

(3)通过 单例模式类模板中 SObject* s = Singleton::GetInstance(); 创建对象。

到此这篇关于c++中的单例类模板的实现方法详解的文章就介绍到这了,更多相关c++ 单例类模板内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值