C++单例模式与单例类模板

1、单例模式

(1)需求的提出:在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在(Single,Instance)

(2)问题:如何定义一个类,使得这个类最多只能创建一个对象?

要控制类的对象数目,必须对外隐藏构造函数

思路:

@1:将构造函数的访问属性设置为private,将拷贝构造函数,赋值操作符都声明成private的,防止对象的赋值操作,因为这个类的对象只能有一个。

@2:定义instance并初始化为NULL。在类中用static type* instance的方式声明一个静态的变量,按照对这个static修饰的访问规则,之后在类外面进行定义初始化为NULL。

@3:然后在类中在提供一个static的成员函数,用来创建对象的,当我们要创建对象的时候,必然会用调用这个函数,这个函数内部就会去访问instance。 @4:访问instance的值,空值时:创建对象,并用instance进行标记(也就是如果instance为NULL,则直接new一个对象出来将地址赋值给

instance,让instance进行标记),然后返回这个对象。非空值时:直接返回instance标记的对象。这样就保证了这个类只能创建一个对象,这就是单例模式。‘

单例模式的对象在整个系统的运行过程当中是绝对不需要释放的,当系统结束运行时,系统自然就会释放这个对象了。所以单例模式的对象不需要在系统运行的时候,也就是不需要在系统生命周期

还没有结束时进行释放。

例:单例模式

#include <iostream>

using namespace std;

/*

* 单例模式

* why 2016/9/6

*

* 实现单例模式的思路:

*

* @1:将构造函数的访问属性设置为private,将拷贝构造函数,赋值操作符都声明成private的,防止对象的赋值操作,因为这个类的对象只能有一个。

* @2:定义instance并初始化为NULL。在类中用static type* instance的方式声明一个静态的变量,按照对这个static修饰的访问规则,之后在类外面进行定义初始化为NULL。

* @3:然后在类中在提供一个static的成员函数,用来创建对象的,当我们要创建对象的时候,必然会用调用这个函数,这个函数内部就会去访问instance。

* @4:访问instance的值,空值时:创建对象,并用instance进行标记(也就是如果instance为NULL,则直接new一个对象出来将地址赋值给

* instance,让instance进行标记),然后返回这个对象。非空值时:直接返回instance标记的对象。这样就保证了这个类只能创建一个对象,这就是单例模式。‘

*/

/*

* 单例模式的对象在整个系统的运行过程当中是绝对不需要释放的,当系统结束运行时,系统自然就会释放这个对象了。所以单例模式的对象不需要在系统运行的时候,

* 也就是不需要在系统生命周期还没有结束时进行释放。

*/

class SObject

{

private:

SObject() //将构造函数隐藏起来

{

}

SObject(const SObject&); //将拷贝构造函数隐藏起来

SObject& operator = (const SObject&); //将赋值操纵隐藏起来

static SObject *c_instance; //声明一个instance的SObject的指针,将来用来标记创建的对象的,也是指向那个对象的指针。因为是static的,所以需要在外部进行定义,初始化为NULL

public:

static SObject* GetInstance(); //声明,用来创建一个对象的,因为你的构造函数已经为private的,所以我们要自己提供一个。因为static的,所以也要在外部进行定义

void print()

{

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

}

};

SObject* SObject::c_instance = NULL;

SObject* SObject::GetInstance()

{

if (c_instance == NULL)

{

c_instance = new SObject(); //如果c_instance这个标记为空,说明没有对象创建,则创建唯一一个对象

}

return c_instance; //返回这个创建的对象的指针

}

int main(void)

{

SObject* s1 = SObject::GetInstance();

SObject* s2 = SObject::GetInstance();

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

s2->print(); //this = 0x893d008 //说明确实只能创建一个对象,因为两个指针指向的都是一个对象

return 0;

}

2、上面的代码实现了单例模式,但是还不是很完美,比如需要定义静态变量c_instance,必须要定义静态成员函数GetIntance(),所以我们可以在完美一下。

解决方案就是:将单例模式相关的代码抽取出来,就是单例模式本身的逻辑模式那部分,不影响类的其他功能,将这部分代码拿出来后开发出单例类模板。当需要单例类时,直接使用单例类模板。

使用方式是,在需要使用单例类模式的类中,用友元关键friend + class + 单例类模板的名字<当前类的名字>,将单例类模板声明为当前类的友元。在单例类模板中实现的是定义静态变量用来

标记对象,和定义静态成员函数来实现判断标记从而决定是否创建新的对象和返回对象的地址。

Singleton英文是单例模式的意思。

3、好的使用单例模式类的例子:

/************************************************单例类模板程序*****************************************/

#ifndef _SINGLETON_H_

#define _SINGLETON_H_

/*

* 单例类模板

* 实现单例模式的逻辑那部分。以后其他的类如果想用单例模式都可以添加将这个单例类模板声明为友元,T是使用该模板的类名,进行实现单例模式

*/

template

< typename T >

class Singleton

{

private:

static T* c_instance;

public:

static T* GetInstance();

};

template

< typename T >

T* Singleton<T>::c_instance = NULL; //将这个标记首先置位空

template

< typename T >

T* Singleton<T>::GetInstance()

{

if (c_instance == NULL) //看是否使用单例模式的类已经定义过对象了。

{

c_instance = new T(); //没有定义对象,则创建一个对象//没有定义对象,则创建一个对象

}

return c_instance; //最后返回这个对象的指针,这个标记就记录着这个对象的地址。这样防止对象对此定义。

}

#endif

/*************************************************使用这个单例类模板而实现的单例模式的类*******************************/

#include <iostream>

#include "Singleton.h"

using namespace std;

/*

* SObject使用单例模式,方式是使用的添加单例类模板进行实现的

*

*

*/

//同时必须要将一些跟对象的创建有关的函数弄成private的,隐藏起来。包括:构造函数、拷贝构造函数、赋值操作符重载函数

class SObject

{

private:

friend class Singleton<SObject>; //将使用的单例类模板声明为当前这个类的友元。这样即可达到使用单例类模板。

SObject()

{

}

SObject(const SObject&);

SObject& operator = (const SObject&);

public:

void print()

{

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

}

};

int main(void)

{

SObject *s1 = Singleton<SObject>::GetInstance();

SObject *s2 = Singleton<SObject>::GetInstance();

SObject *s3 = Singleton<SObject>::GetInstance();

s1->print(); //会发现三个的指针值都是一样,说明都是指向的同一个对象,说明单例模式实现成功,单例模式下的类只能创建一个对象

s2->print();

s3->print();

return 0;

}

时间: 2024-10-06 13:10:23

C++单例模式与单例类模板的相关文章

第62课 单例类模板

1. 单例需求的提出 (1)在架构设计时,某些类在整个系统生命期中最多只能有一个对象存在(Single Instance) (2)问题:如何定义一个类,使得这个类最多只能创建一个对象 2. 单例模式 (1)要控制类的对象数目,必须对外隐藏构造函数 (2)思路 ①将构造函数的访问属性设置为private ②定义instance,并初始化为NULL ③提供静态函数getInstance来返回单例实例,并判断当instance的值为空时,并创建对象,并保存在instance指针中,非空值时直接返回in

单例类模板(五十一)

在有些时候,我们在进行架构设计时,某些类在整个系统生命期中最多只能有一个对象存在(Single Instance).比如在超市的收银系统,一个扫描机就对应一个,每个屏幕也会对应一个,基于这种情况,我们就提出了单例模式.那么问题就来了:如何定义一个类,并且使得这个类最多只能创建一个对象呢?那么就必须得控制类的对象数目,必须对外隐藏构造函数.思路是:将构造函数的访问属性设置为 private,定义 instance 并初始化为 NULL:当需要使用对象时,访问 instance 的值,如果是空值,那

C++之单例类模板

单例类模板:一个类只能有一个对象,比如超市收银系统中清点物品的仪器只有一个 设计思路: 1.构造函数,拷贝构造函数必须设计为private,防止自己生成新的对象 2.且类的指针要设计为static类型,并初始化为NULL 3.当需要使用对象时(即访问类指针) 空值:则重新分配对象 非空值:返回当前所指向的对象 代码如下 1 #include<iostream> 2 3 using namespace std; 4 5 //扫描物品的工具类 6 class SObject 7 { 8 priva

28.C++- 单例类模板(详解)

描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针)  , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区别在于创建实例的时间不同: 懒汉式 : 指代码运行后,实例并不存在,只有当需要时,才去创建实例(适用于单线程) 饿汉式 : 指代码一运行,实例已经存在,当时需要时,直接去调用即可(适用于多线程) 用法 将构造函数的访问属性设置为private, 提供一个GetInstance()静态成员函数,只能供用户访问

Unity3D单例类模板类

C#代码   using UnityEngine; /// <summary> /// Be aware this will not prevent a non singleton constructor ///   such as `T myT = new T();` /// To prevent that, add `protected T () {}` to your singleton class. /// /// As a note, this is made as MonoBeha

c++:自己动手实现线程安全的c++单例类

前段时间使用c++做项目开发,需要根据根据配置文件路径加载全局配置文件,并对外提供唯一访问点.面对这样一个需求,自然的就想到了使用单例模式来创建一个单例配置对象,供外部调用.一开始想使用boost中自带的单例类来实现,但是遗憾的是,boost中的的单例类好像只能使用无参的类构造函数,而我希望将配置文件路径作为单例配置对象的构造函数参数,此外正好借此机会使用c++自己动手实现一个单例类. 1.线程安全的c++单例类 实现线程安全的c++单例类,主要要实现以下几点:1)构造函数私有化,即构造函数.拷

单例类的总结

/** * 单例类的两种方法. * 1.饿汉式 * 当类一加载就开始创建对象 * 2.懒汉式 * 当需要使用到类的对象是调用类的类方法才开始创建对象,想比较上面而言是 * 懒汉式. * 注意,单例类的特点: * 1.必须要将构造函数私有化,这样才能防止别的类通过构造方法来建立对象,但是也是因为如此,所以 * 单例类的成员变量和成员函数都必须要用static修饰,因此要想调用单例类的函数,只能通过类名.类方法的方式来进行 * 调用. * 2.必须要在类内创建一个本类的对象. * 3.向外提供一个公

单例类多线程

作为设计模式理论中的Helloworld,相信学习java语言的人,都应该听说过单例模式.单例模式作为对象的一种创建模式,它的作用是确保某一个类在整个系统中只有一个实例,而且自行实例化并向整个系统提供这个实例. 由此可见,单例模式具有以下的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一的实例. 单例类必须给所有其他对象提供这一实例. 由于Java语言的特点,使得单例模式在Java语言的实现上有自己的特点.这些特点主要表现在单例类如何将自己实例化. 饿汉式单例类 饿汉式单例类是在Ja

(七)boost库之单例类

(七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 单例,通常在一个大型项目中单例是非常常见的,boost库没有提供专门的单例类,但可以在其它库中找到他的实现 #include <boost/serializat