C++设计模式之Singleton模式

《C++ 设计模式》 设计模式代表了最佳的实践,在面向对象的编程中被很多老鸟们反复使用。使用设计模式有很多好处:可重用代码、保证代码可靠性、使代码更易被他人理解 ...... 阅读详情

C++设计模式之Singleton模式

http://www.cnblogs.com/chain2012/archive/2011/01/10/1932055.html

 

 

一、功能

  保证一个类仅有一个实例。 

 

二、结构图

三、优缺点

  Singleton模式是做为"全局变量"的替代品出现的。所以它具有全局变量的特点:全局可见、贯穿应用程序的整个生命期,它也具有全局变量不具备的性质:同类型的对象实例只可能有一个。

四、实现

 

    
class Singleton
{
public :
static Singleton * Instance();

protected :
Singleton() { }

private :
static Singleton * _instance;
Singleton( const Singleton & );
Singleton & operator = ( const Singleton & );
};

Singleton * Singleton::_instance = NULL;

Singleton * Singleton::Instance()
{
(_instance == NULL) ? _instance = new Singleton() : 0 ; // lazy initialization
return _instance;
}

 

(1)因为返回的是指针,为防止用户调用delete函数,可把static Singleton *_instance;改为在Instance()中定义static Singleton _instance。这样显然更安全,同时也具有lazy initialization的特性(即第一次访问时才创建)。 

(2)假设需要从Singleton派生子类,而子类也需要有同样的性质,既只能创建一个实例。我觉得,这很难办。根本原因在于Instance()函数不是虚函数,不具有多态的性质。一种常用方法是把Instance()函数移到子类中,这时就只能用static Singleton *_instance,而不能用static Singleton _instance了,除非把_instance也要移到子类,无论怎么做都不优雅。另一种方法是用模板。具体用什么方法,只能根据实际情况权衡。


五、示例代码

 (1)没子类的情况

 

    
namespace DesignPattern_Singleton
{
class Singleton
{
public :
static Singleton * Instance() { static Singleton _instance; return & _instance; }
protected :
Singleton() { }
private :
Singleton( const Singleton & );
Singleton & operator = ( const Singleton & );
};
}
// 客户端代码:
{
using namespace DesignPattern_Singleton ;
Singleton * p = Singleton::Instance() ;
......
}

 


 

 (2)有子类的情况 

方法一:

   
namespace DesignPattern_Singleton
{
// class Singleton
class Singleton {
protected :
Singleton() { }
static Singleton * _instance;
private :
Singleton( const Singleton & );
Singleton & operator = ( const Singleton & );
};

Singleton * Singleton::_instance = NULL;

// class ConcreteSingleton
class ConcreteSingleton : public Singleton {
public :
static Singleton * Instance() ;
protected :
ConcreteSingleton() {}
};

Singleton * ConcreteSingleton::Instance()
{
(_instance == NULL) ? _instance = new ConcreteSingleton() : 0 ;
return _instance;
}
}
// 客户端代码:
{
using namespace DesignPattern_Singleton ;
Singleton * p = ConcreteSingleton::Instance() ;
}

 

方法二:

 

   
namespace DesignPattern_Singleton
{
// class Singleton
class Singleton {
protected :
Singleton() { }
private :
Singleton( const Singleton & );
Singleton & operator = ( const Singleton & );
};

// class ConcreteSingleton
class ConcreteSingleton : public Singleton {
public :
static Singleton * Instance() { static ConcreteSingleton _instance; return & _instance; }
protected :
ConcreteSingleton() { }
};
}
// 客户端代码:
{
using namespace DesignPattern_Singleton ;
Singleton * p = ConcreteSingleton::Instance() ;
}

 

方法三:

 

   
namespace DesignPattern_Singleton
{
template < class T >
class Singleton {
public :
static T * Instance() { static T _instance; return & _instance; }
protected :
Singleton() { }
private :
Singleton( const Singleton & );
Singleton & operator = ( const Singleton & );
};

class ConcreteSingleton : public Singleton < ConcreteSingleton > { } ;
}
// 客户端代码
{
using namespace DesignPattern_Singleton ;
ConcreteSingleton * p = ConcreteSingleton::Instance() ;

C++设计模式_12_Singleton 单件模式 总体来说,如果是单线程使用版本1已经是足够好了;如果是多线程,使用版本2是OK的,但是效率不高;双检查锁在不使用volatile不能用,是很容易出现问题的;C++11版本之后跨平台实现双检查锁就使用的是最后一个版本保证一个类仅有一个实例,并提供一个该实例的全局访问点–《设计模式》GoFSingleton模式中的实例构造器可以设置为protected以允许子类派生Singleton模式一般不要支持拷贝构造函数和Clone接口,因为这有可能导致多个对象实例,与Singleton模式的初衷违背。 阅读详情

相关推荐

【C++设计模式】Singleton 单例设计模式与线程安全

何为设计模式(Design Pattern) 设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式代表了最佳的实践,是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 单例模式(Singleton) 什么是单例...

ZY-JIMMY 2723

C++设计模式(全23种)

设计模式概述 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。等这种思想融入到了思想中后,你就会不自觉地使用这种思想去进行你的设计和开发。 文章目录设计模式概述一、创建型模式Factory 模式(工厂模式)AbstactFactory 模式(抽象工厂模式)Singleton 模式( 单例模式)Builder 模式(建造者模式)Prototype 模式(原型模式)二、结构型模式Bridge 模式(桥接模式)总结

weixin_45712636的博客 9万+

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2861

C++ 常用设计模式(学习笔记)

设计模式 1、工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。 1.1、简单工厂模式 主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。使用简单工厂模式,我们只需要知道具体的产品型号就可...

duchengjun的博客 1909

淘宝抓包,直达函数内部request请求体和response响应体, 告别FD, Charles,SSL,justtrustme 等http代理,证书工具。

淘宝抓包,hook发包函数,直接获取response相应数据

binary66的博客 4468

踩坑记录:Clawdbot 对接 Minimax 报错 “401 token is unusable (1004)“ 的终极解决方案

如果你也在配置 Clawdbot 对接 Minimax 模型时,明明 API Key 是新申请的,却死活报错 `401 Unauthorized`,错误码 `1004`,提示 `token is unusable`——那么恭喜你,来对地方了。

hampeter的博客 2000

C++设计模式总结

一、单例模式 一个类不管常见多少次对象,永远只能得到该类型一个对象的实例 // p1、p2、p3指向同一对象 A* p1 = new A(); A* p2 = new A(); A* p3 = new A(); 饿汉式单例模式: 还没有获取实例对象,实例对象就已经产生了 优点:线程安全。对象存放在数据段,main函数还没有开始执行,对象就已经初始化好了,一定是线程安全的。 缺点: 获取在软件启动的时候,并没有使用到这个对象,然而这个对象已经产生,这就比较浪费资源。 #include<iostream

长期更新自学笔记 5246

北斗B1频点信号捕获实战:如何应对NH码跳变带来的挑战?

本文深入探讨了北斗B1频点信号捕获中NH码跳变带来的核心挑战。针对NH码以1kHz速率调制导致的相干积分中断和相关峰畸变问题,文章提出并详细解析了一种基于伪码与多普勒频率分离技术的优化捕获方案。该方案通过差分处理消除NH跳变影响,并利用匹配滤波器与FFT分别进行码相位和多普勒频率的快速估计,有效提升了弱信号环境下的捕获灵敏度和稳定性,为北斗接收机设计提供了实用的工程参考。

joy55的博客 534

c++—设计模式

c++—设计模式

m0_72814368的博客 3014

Python 中调用 R 语言的教程(包含编码问题解决办法)

rpy2 是一个 Python 库,允许在 Python 中直接运行 R 代码并实现数据转换。安装需确保 Python 和 R 环境正确配置,Windows 用户需注意编码问题(GBK 错误可通过控制面板调整区域设置解决)。基本用法包括执行 R 代码、传递数据(支持 Python 与 R 数据类型自动转换)以及调用 R 包函数。通过 robjects.r() 执行 R 代码,使用 pandas2ri 转换器处理 DataFrame 数据交换,并支持像导入 Python 模块一样加载 R 包(如 import

zygalaxy的博客 995

保姆级图解:HKMG工艺中的‘覆盖层’(Cap Layer)到底怎么调阈值电压?

本文深入解析了HKMG工艺中覆盖层(Cap Layer)如何精准调控阈值电压的关键技术。通过原子级精度的ALD工艺和材料选择,覆盖层在半导体制造中扮演着隐形调节器的角色,直接影响晶体管的电气特性。文章详细介绍了La2O3和Al2O3等材料的特性对比、ALD工艺的原子级控制,以及实战调试中的关键步骤和问题排查方法。

weixin_27032989的博客 495

C++设计模式:Singleton的模板实现之一

题目:C++设计模式:Singleton的模板实现之一类型:原创作者:古斌亮时间:2002.12.25EMail : KingLinux@163.com  在http://www.youkuaiyun.com/ 和天极网 看了两篇关于设计模式:Singleton的C++实现的文章,自觉的学到不少东西(:)),在这里我也写了一个C++模板的实现之一,望各位大虾多多指教,也希望可以达到抛砖引玉的作用.

野草的专栏 1874

微信小程序 - 最新将页面可分享到朋友圈功能,小程序实现分享到朋友圈功能,开启分享给好友及分享朋友圈功能(微信小程序怎么分享到朋友圈?详细流程及示例代码教程)

没有设置过分享朋友圈功能的小程序,分享朋友圈按钮是灰色且无法点击。小程序 vue2 | vue3 版本语法都能使用,跟着教程复制代码运行即可。如下图所示,将页面开启分享后便可由用户转发出去。

🏆 前端领域优质创作者 2416

singleton设计模式,c++实现

singleton设计模式就是实现对象只能new一次         #include class base { private: base() { // std::cout<<"hello world"<<std::endl; str = "hello world"; // me = NULL; } public: char* str; priv

paul08colin 1360

【回眸】Tessy集成测试软件使用指南(一)新手使用篇

这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试,集成测试需要有一定单元测试基础,且做集成测试之前,需要做好单元测试,否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直接从单元测试到系统测试,结果往往是不理想的。集成测试可以检测由于单元相互交互而导致的错误,通常由一组专业的测试人员执行。

啤酒鸭的物联网开发记录博客 5276

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++设计模式学习(二) Singleton 模式

一、Singleton 模式 1.个人认为 Singleton 模式是设计模式中最为简单、最为常见、最容易实现,也是最应该熟悉和掌握的模式。且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是 Singleton 模式。Singleton 模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于设计模式精解-GoF 23 种设计模式解析附 C++实现源码 对象的设计中...

qq_34675171的博客 330

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++设计模式之Singleton

一、功能保证一个类只能产生一个实例。二、结构图暂无三、优缺点 Singleton模式是做为”全局变量”的替代品出现的。所以它具有全局变量的特点:全局可见、贯穿应用程序的整个生命期,它也具有全局变量不具备的性质:同类型的对象实例只可能有一个。四、代码示例教科书上的Singleton定义如下: class Singleton { public: static Singleton* Ins

~探路者~的博客 569

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++实现Singleton设计模式

这个设计模式主要目的是想在整个系统中只能出现一个类的实例。,比如你的软件的全局配置信息,或是一个主控类,等等。 // Singleton.h // C++:最简单的方式实现Singleton设计模式 #include  #include  using namespace std; class Singleton { private:

C__Allen的程序人生 816

C++设计模式 - Singleton

Singleton单例模式 Singleton 是对全局变量的取代策略作用:保证一个类只能有一个实例,并提供一个全局唯一的访问点。 仅有一个实例:通过类的静态成员变量来体现。 提供访问它的全局访问点:访问静态成员变量的静态成员函数来体现。 《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。 单例模式通过类本身来管理其唯一实例,这种特性提供了解决问题的方法。唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个

Slamer杨的博客 790

C++Singleton设计模式思考

先说重点,我觉得网上很多文章的Singleton实现都有些老。 我认为只需要这么写。 class Singleton1 { Singleton1() { } public: static Singleton1& get_instance() { static Singleton1 instance; return instance; } }; Singleton模式的...

Lerchain的博客 176

C++设计模式——单例模式(Singleton Pattern)

C++设计模式——单例模式(Singleton Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——单例模式(Singleton Pattern)目录定义代码示例懒汉模式线程/内存不安全方式智能指针+双检锁模式和智能指针+call_once模式局部静态变量模式饿汉模式总结参考资料 定义 单例模式顾名思义,保证一个类仅可以有一个实例化对象,并且提供一个可以访问它的全局接口。实现单例模式必须注意一下几点: 单例类只能由一个实例化对象。 单例类必须自己提供一个实例化对象。 单例类必须

leonardohaig的博客 1467

C++实现设计模式: Singleton 单例模式

又一次仔细读了刘未鹏写的《暗时间》,总结自己之所以在编程方面成长不理想的原因就是自己花在总结上的时间太少了,总是写过的代码和用过的模式很快就忘记了,有点过分依赖参考资料和Google. 因此,今天起陆续总结一下自己使用过的一些设计模式,不过由于C++设计模式方面的资料很少,我将坚持采用C++语言说明。 第一回:Singleton  很简单,不做说明了,有疑问请邮件联系

初心 1805

C++设计模式之:单例模式singleton

it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式坚持七大原则:开闭原则,单一职责原则,里氏替换原则,依赖倒转原则,接口隔离原则,迪米特原则,合成复用原则,而各项设计模式又区分为三大模式,创建型模式,结构型模式,行为模式。

weixin_45068267的博客 1859

本地TTS部署实战:正义芝言语音生成工具的环境配置与功能测试

文本到语音(TTS)技术作为语音合成领域的核心分支,通过深度学习模型将文字信息转换为自然流畅的语音输出。其技术原理基于声学建模和波形生成,能够模拟人类发音的韵律特征和情感表达。在工程实践中,本地化部署的TTS工具如正义芝言,既保障了数据隐私安全,又支持音色克隆和长文本处理等定制化需求。这类工具特别适用于内容创作、有声读物制作等需要批量处理语音的场景。通过合理的环境配置和资源优化,用户可以在普通硬件条件下实现高质量的语音生成,其中显存管理和批量任务调度是关键的技术要点。本文以正义芝言项目为例,详细演示从环境准

weixin_34279579的博客 297

C++设计模式:Singleton的模板实现之一 (转)

C++设计模式:Singleton的模板实现之一 (转)[@more@]题目:C++设计模式:Singleton的模板实现之一类型:原创 作者:古斌亮时间:2002.12.25EMail : Linux@163.com"&gt...

ciya3282的博客 202
上一篇: 在C++中计算物件个数(Objects Counting in C++)
下一篇: Effective C++ Item07
chainyu
博客等级 码龄17年 406粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值