前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >设计模式学习之单件模式

设计模式学习之单件模式

作者头像
零式的天空
发布于 2022-03-28 11:26:38
发布于 2022-03-28 11:26:38
36200
代码可运行
举报
文章被收录于专栏:零域Blog零域Blog
运行总次数:0
代码可运行

如下内容是学习《Head First 设计模式》第五部分《单件模式》所得,主要就是一些原文摘抄和少量自己的总结。

单件模式定义

单件模式确保类只有一个实例,并提供一个全局访问点。

书中示例的 C++ 实现版源码

这个 Solution 的 SingletonPattern 工程里

书中示例的类图

Visio 原图见这里:

关键代码片断

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CSingleton
{
public:
    static CSingleton* GetInstance();

    /**
    释放单例,应仅限于所有对单例对象的使用完成后调用
    */
    static void ReleaseInstance();

    void DoSomething();

private:
    CSingleton();
	CSingleton(const CSingleton&);  // private and not implemented copy constructor
	CSingleton& operator=(const CSingleton&); // private and not implemented = operator

    volatile static CSingleton* m_sUniqueInstance;
    static HANDLE m_hSync;
};
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
volatile CSingleton* CSingleton::m_sUniqueInstance = NULL;
HANDLE CSingleton::m_hSync = ::CreateEvent(NULL, FALSE, TRUE, NULL);

CSingleton* CSingleton::GetInstance()
{
    if (NULL == m_sUniqueInstance)
	{
        WaitForSingleObject(m_hSync, INFINITE);
        if (NULL == m_sUniqueInstance)
		{
            m_sUniqueInstance = new CSingleton();
		}
        SetEvent(m_hSync);
	}

    return (CSingleton*)m_sUniqueInstance;
}

void CSingleton::ReleaseInstance()
{
    if (0 != m_sUniqueInstance)
	{
        delete m_sUniqueInstance;
        m_sUniqueInstance = NULL;
	}

    if (NULL != m_hSync)
	{
        CloseHandle(m_hSync);
	}
}

小结

  1. 单件模式的精华是通过设计来限制一个类产生多个实例的可能性,从而满足有且仅能有一个实例的类的设计需求。
  2. 为了实现上述目标,采用了私有化构造函数和提供一个公开的获取唯一实例的接口。
  3. 要记得将复制构造函数和重载赋值运算符也声明为私有,不然类的用户仍然可以使用CSingleton ObjA(*CSingleton::GetInstance())CSingleton ObjB = *CSingleton::GetInstance())的写法来得到第二、第三甚至更多的实例对象。
  4. 为了实现多线程安全,在创建唯一实例的时候会采用多线程同步设施如临界区、事件等来保证,声明实例指针使用 volatile 关键字。
  5. Java 等语言中有「同步方法」和「急切」创建实例等方式来解决多线程的问题,C++ 中貌似都不太适用,使用 volatile 加双重检查加锁相对靠谱。
  6. 记得在合适的地方释放单例以及时和正确地回收资源。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式 ---单例模式
单例模式概念 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。 GoF对单例模式的定义是:保证一个类、只有一
用户3479834
2021/02/03
4150
设计模式 ---单例模式
设计模式----单例模式
单间模式: 确保一个类只有一个实例,并提供一个全局访问点。 如果需要一个类只能创建一个对象,可以使用单件模式。 经典的单件模式实现: public class Singleton{ //利用一个私有静态变量记录该类的唯一实例 private static Singleton uniqueInstance; ... //其他变量 //构造器定义为私有,只有自Singleton类内部才能调用 private Singleton(){} //利用一个静态方法
SuperHeroes
2018/05/30
5800
设计模式学习-单例模式
饿汉模式 单例模式又被称为单件模式,这个模式作用是保持程序中只有`唯一`对象,一听到唯一,那肯定就明白了,无非就是不让别人创建新对象呗,只需要两点就可以 1.私有化构造函数, 2.创建一个静态对象
莫问今朝
2018/10/18
5160
设计模式学习-单例模式
设计模式01——单例模式
设计模式一定要运用到具体应用中。 创建型模式:单例模式、工厂模式、抽象工厂模式、创建者模式、原型模式。 结构性模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、责任链模式、访问者模式。
matt
2022/10/25
2230
设计模式01——单例模式
设计模式(7)——单例模式(Singleton Pattern,创建型)
使用设计模式可以提高代码的可复用性、可扩充性和可维护性。单例模式(Singleton Pattern),确保一个类只有一个实例,并提供一个全局访问点。
恋喵大鲤鱼
2018/08/03
8290
设计模式(7)——单例模式(Singleton Pattern,创建型)
java设计模式之单例模式|单例模式之饿汉模式、懒汉模式、枚举方式|最详细的6种懒汉模式详解
概括一下ObjectOutputStream().readObject()的整个大致流程
小小鱼儿小小林
2022/10/06
1.6K0
java设计模式之单例模式|单例模式之饿汉模式、懒汉模式、枚举方式|最详细的6种懒汉模式详解
Java设计模式——线程安全的单件模式
  单件模式的类图是所有模式的类图中最简单的——只有一个类。尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重对这一点来进行分析解决。
王金龙
2018/09/05
6750
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之单件模式
今年春节王者荣耀出了一个叫做“王者快跑”的限时玩法,许多玩家都很喜欢这个游戏模式。不同于5V5的王者地图,这个地图是一个跑道中途有很多的障碍物,还有NPC玩家释放控制技能做阻拦,简单益智,只要一直跑就可以了,最终按照所有玩家到达终点的时间前后顺序获得名次。
荣仔_最靓的仔
2021/01/30
4040
谈谈单例模式
那么有人要问,那我不就定义一个类,程序只初始化一个全局的实例就好了吗?没错,这样是可以的。但是我们都知道程序会经过多人的接手维护和开发,比如第N个接手程序的时候,并不知道这个类定义的时候只能初始化一个实例,然后又实例化了新的对象, 则可能会造成意想不到的场景。那么这时候就要提到防御性编程,个人认为单例模式的实现也是防御性编程的一种方式,让这个类保证只有一个实例化对象,并且如果试图构造多个对象的时候,在程序的编译期报错。题外话,这也是为什么本人在进行一些稍大规模开发的时候,只会去选择强类型语言,而不会选择弱类型语言的原因,强类型语言会在编译期间帮我们避免很多运行时可能产生的的Bug。
河边一枝柳
2021/09/24
3840
Java设计模式之单例模式
这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝,中国的历史上很少出现两个皇帝并存的时期,是有,但不多,那我们就认为皇帝是个单例模式,在这个场景中,有皇帝,有大臣,大臣是天天要上朝参见皇帝的,今天参拜的皇帝应该和昨天、前天的一样(过渡期的不考虑,别找茬哦),大臣磕完头,抬头一看,嗨,还是昨天那个皇帝,单例模式,绝对的单例模式,先看类图:
CoderJed
2018/09/13
3800
Java设计模式之单例模式
【设计模式】单例设计模式
单例模式是一种设计模式,它确保一个类只能创建一个实例,并提供一种全局访问这个实例的方式。在Java中,单例模式可以通过多种方式来实现,其中最常见的是使用私有构造函数和静态方法实现
陶然同学
2023/10/14
3280
设计模式篇之一文搞懂如何实现单例模式
大家好,我是小简,这一篇文章,6种单例方法一网打尽,虽然单例模式很简单,但是也是设计模式入门基础,我也来详细讲讲。
JanYork_简昀
2023/03/16
4.5K0
设计模式篇之一文搞懂如何实现单例模式
设计模式----单例模式详解
单例模式是java中用的比较多的一种设计模式,目的就是让一个应用中对于某个类,只存在唯一的实例化对象。单例模式有很多实现方案,各有利弊,接下来将做详细分析介绍。
叔牙
2020/11/19
5270
设计模式----单例模式详解
【设计模式自习室】透彻理解单例模式
对于系统中的某些类来说,只有一个实例很重要。比如大家熟悉的Spring框架中,Controller和Service都默认是单例模式。
Rude3Knife的公众号
2019/12/31
4330
【设计模式自习室】透彻理解单例模式
设计模式——单例模式
设计模式——单例模式
Java架构师必看
2021/05/14
2230
设计模式——单例模式
使用 C#/.NET Core 实现单体设计模式
本文的概念内容来自深入浅出设计模式一书 由于我在给公司做内培, 所以最近天天写设计模式的文章.... 单体模式 Singleton 单体模式的目标就是只创建一个实例. 实际中有很多种对象我们可能只需要
solenovex
2018/04/17
6700
使用 C#/.NET Core 实现单体设计模式
设计模式:单例模式
单例模式是一种 **创建型设计模式**,确保一个类 **只有一个实例**,并提供一个 **全局访问点** 来获取该实例。它的核心目标是控制对象的创建过程,避免资源重复占用或状态不一致。
用户11531739
2025/03/04
900
设计模式(二)单例模式Singleton(创建型)
几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销。再如大家最经常用的IM,如QQ,在同一台电脑,一个帐号只能有唯一的登录。
黄规速
2022/04/14
2410
设计模式(二)单例模式Singleton(创建型)
Java-单例模式
单例模式是我们实际开发中常用到的开发模式,目的是保证实例的唯一性,确保这个类在内存中只会存在一个对象,但我们现在用到的单例模式相关代码可能不是最优的,今天让我们探索一下单例模式的正确写法。 单例模式通常分为饿汉式和懒汉式,我们这里来一个最简单的代码: 饿汉式相关代码:
android_薛之涛
2018/12/27
5530
单例这种设计模式
随着我们编写代码的深入,我们或多或少都会接触到设计模式,其中单例(Singleton)模式应该是我们耳熟能详的一种模式。本文将比较特别的介绍一下Java设计模式中的单例模式。
技术小黑屋
2018/09/05
3980
相关推荐
设计模式 ---单例模式
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文