单件模式之土著人地可乐瓶

微信小程序 - 接入腾讯地图 SDK 及详细使用教程,结合小程序 mpa 地图组件展示腾讯地图(基础使用 / 授权当前位置 / 配合小程序map组件的使用 / 腾讯地图逆地址解析 / 坐标系的转化) 微信小程序使用腾讯地图完整流程,微信小程序 接入腾讯地图,如何在微信小程序中接入腾讯地图,微信小程序引入腾讯地图API方法,腾讯地图小程序SDK,微信小程序实现使用腾讯地图SDK步骤详细介绍,微信小程序接入腾讯地图(线路规划、逆解析)、高德地图,微信小程序之使用腾讯地图,微信小程序 接入第三方地图,小程序服务器配置地图,微信小程序接入腾讯地图,微信小程序插入腾讯地图教程,微信小程序如何调用腾讯地图,如何在微信小程序中接入腾讯地图,微信小程序腾讯地图SDK使用方法,在微信小程序上创建一个简单的腾讯地图,微信小 阅读详情

话说一群土著人生活地球的某个不为人知的地方,他们过着和谐、快乐的日子。但是好景不长,一只从天上掉下来的玻璃瓶打破了这美好的时光。这只玻璃瓶用处非常广泛,有的土著人用它来砸地瓜,有的用它来吹口哨,有的用它来擀蛇皮……,渐渐地大家干活、娱乐都离不开它了,于是产生了争抢使用可乐瓶的情况,为了获得原有的和谐气氛,一个土著人决定扔掉这个瓶子……
  剧情讲完了,我们先为这个瓶子定义一个类:

class CGlassBottle  

{

private:

	CGlassBottle();

public:

	virtual ~CGlassBottle();

public:

	static BOOL OnKnock();//砸

	static BOOL OnBlow();//吹

	static BOOL OnRoll();//擀

protected:

	static BOOL s_bUsed;//是否正在被使用

};

  我们定义一个土著人A类,假设他只用玻璃瓶砸地瓜:

class A//土著人A

{

public:

	void UseBottle()

	{

		CGlassBottle::OnKnock();

	};

};

  我们再定义一个土著人B类,假设他只用玻璃瓶吹口哨:

class B//土著人B

{

public:

	void UseBottle()

	{

		CGlassBottle::OnBlow();

	};

};

  现在我们定义土著人A、B类的对象,让他们执行UseBottle:

int main(int argc, char* argv[])

{

	A a;

	B b;

	a.UseBottle();//执行Knock

	b.UseBottle();//执行blow

	return 0;

}

我们来执行一下,看看结果:


图一 执行结果

  执行结果跟我们预期的一样,这就是传说中的类单件,土著人A用它来砸地瓜,土著人B用它来吹口哨。我个人对类单件的理解是这样的,类单件是对相似的函数块、功能块或其他模块进行封装,尽量不涉及类的属性。像二进制,十进制,十六进制字符串进行相互转换的函数,如:

class CNumFormat

{

private:

	CNumFormat();

public:

	static CString From2TO10(LPCTSTR lpszTxt2);

	static CString From2TO16(LPCTSTR lpszTxt2);

	static CString From10TO2(LPCTSTR lpszTxt2);

	static CString From10TO16(LPCTSTR lpszTxt2);

	static CString From16TO2(LPCTSTR lpszTxt2);

	static CString From16TO10(LPCTSTR lpszTxt2);

};

  在本例子中的CGlassBottle类,这样用也是可以的,但我们还可以把它设计得更好。在《深入浅出设计模式》中是这样定义单件模式的:确保一个类只有一个实例,并提供全局访问点。下面我们根据该定义对CGlassBottle类进行改进:

class CGlassBottle  

{

private:

	CGlassBottle();

public:

	virtual ~CGlassBottle();

public:

	bool OnKnock();//砸

	bool OnBlow();//吹

	bool OnRoll();//擀

public:

	static CGlassBottle s_GlassBottle;//定义

protected:

	bool m_bUsed;//是否正在被使用

};

  对土著人A、B类进行相应的修改:

class A//土著人A

{

public:

	void UseBottle()

	{

		CGlassBottle::s_GlassBottle.OnKnock();

	};

};

class B//土著人B

{

public:

	void UseBottle()

	{

		CGlassBottle::s_GlassBottle.OnBlow();

	};

};

  很多时候我们不希望s_GlassBottle暴露出来,而更希望通过函数调用来获取,于是增加一个获取s_GlassBottle的函数,同时把GlassBottle搞成私有静态成员,具体如下:

class CGlassBottle  

{

private:

	CGlassBottle();

public:

	virtual ~CGlassBottle();

public:

	bool OnKnock();//砸

	bool OnBlow();//吹

	bool OnRoll();//擀

public:

	static CGlassBottle* GetInstance()

	{

		return &s_GlassBottle;

	}

private:

	static CGlassBottle s_GlassBottle;//定义

protected:

	bool m_bUsed;//是否正在被使用

};

  土著人 A、B类在UseBottle()时进行如下修改:

class A//土著人A

{

public:

	void UseBottle()

	{

		CGlassBottle::GetInstance()->OnKnock();

	};

};

class B//土著人B

{

public:

	void UseBottle()

	{

		CGlassBottle::GetInstance()->OnBlow();

	};

};

  可能许多朋友都听说过延迟实例化这个概念,那我们这里也玩玩这个概念:

	class CGlassBottle  

	{

	private:

		CGlassBottle();

	public:

		virtual ~CGlassBottle();

	public:

		bool OnKnock();//砸

		bool OnBlow();//吹

		bool OnRoll();//擀

	public:

		static CGlassBottle* GetInstance()

		{

			static CGlassBottle s_GlassBottle;//定义

			return &s_GlassBottle;

		}	

	protected:

		bool m_bUsed;//是否正在被使用

};

  其实我也偏好这种用法,不知道在多线程下面会不会有问题(我只在单线程下玩,所以还没有发现过问题)。但是你会发现在调用GetInstance()的时候必须要在前面加上CGlassBottle::,在调用时像下面这样:

CGlassBottle::GetInstance()->OnKnock();

  这是不是会让人觉得啰嗦呢,至少对我来说很啰嗦,但我们还可以像下面这么处理:

#define GetGlassBottle() CGlassBottle::GetInstance()

用的时候就这么用“GetGlassBottle()->Knock();”,当然还可以对CGlassBottle进行改进,不知道这叫不叫改进:

class CGlassBottle  

{

private:

	CGlassBottle();

public:

	virtual ~CGlassBottle();

public:

	bool OnKnock();//砸

	bool OnBlow();//吹

	bool OnRoll();//擀

private:

	friend CGlassBottle* GetGlassBottle();



	static CGlassBottle* GetInstance()

	{

		static CGlassBottle s_GlassBottle;//定义

		return &s_GlassBottle;

	}	

protected:

	bool m_bUsed;//是否正在被使用

};

inline CGlassBottle* GetGlassBottle()

{

	return CGlassBottle::GetInstance();

}

  现在可以这样用了:

GetGlassBottle()->OnKnock();

  这样看起来是不是舒服多了。
  我这个人比较懒,一直喜欢像下面这样用,因为一直没有出现过问题,所以用得挺爽:

class CGlassBottle  

{

private:

	CGlassBottle();

public:

	virtual ~CGlassBottle();

public:

	bool OnKnock();//砸

	bool OnBlow();//吹

	bool OnRoll();//擀

private:

	friend CGlassBottle* GetGlassBottle();	

protected:

	bool m_bUsed;//是否正在被使用

};

inline CGlassBottle* GetGlassBottle()

{

	static CGlassBottle s_GlassBottle;//定义

	return &s_GlassBottle;

}

  文章到此结束,如有不妥之处,请来信告知。

 

转自:http://www.cnoffice.info/Program/VC/VCZH/Program_5F256114.html

msfvenom制作windows/linux/android/ios木马 msfvenom选项如下 -p, --payload<payload> 指定 payload(攻击荷载)。如果使用自定义payload,请使用'-'或者stdin指定。 -l, --list [module_typel列出指定模块的所有可用资源。模块类型包括:payloads, encoders, nops, all -n, --nopsled <length>为payload预先指定一个NOP滑动长度。 -f, --format <format>指定输出格式(使 阅读详情

相关推荐

oVirt 4.4.10超详细安装指南:从零搭建企业级虚拟化环境(附常见错误排查)

本文提供了oVirt 4.4.10企业级虚拟化平台的超详细安装指南,涵盖环境规划、系统准备、Engine安装配置、计算节点部署、存储系统集成及高级运维技巧。通过实战操作手册和常见错误排查方法,帮助用户从零搭建稳定高效的虚拟化环境,特别适合企业IT管理员参考实施。

wasm7browser的博客 351

单件模式之土著人的可乐瓶

 单件模式之土著人的可乐瓶作者:ABao.oO下载源代码  话说一群土著人生活地球的某个不为人知的地方,他们过着和谐、快乐的日子。但是好景不长,一只从天上掉下来的玻璃瓶打破了这美好的时光。这只玻璃瓶用处非常广泛,有的土著人用它来砸地瓜,有的用它来吹口哨,有的用它来擀蛇皮……,渐渐地大家干活、娱乐都离不开它了,于是产生了争抢使用可乐瓶的情况,为了获得原有的和谐气氛,一个土

574

从零开始STM32cubeide学习

使用的是正点原子的精英版,单片机是STM32F103ZET6,详细讲解完成跑马灯实验

weixin_44077208的博客 2279

单件模式之可乐瓶实现

<br />/////////////////////第一种单件模式///////////////////////////////// /*#include "iostream.h" class CGlassBottle { public: CGlassBottle(); public: virtual ~CGlassBottle(); public: void OnKnock(){cout<<"OnKnock"<<endl;}; void OnBlow(){cout<<

GZFStudy的专栏 1119

数据挖掘实战-基于决策树算法构建北京市空气质量预测模型

通过分析这些数据,我们将利用决策树算法建立预测模型。决策树算法具有直观易懂、分类效果好等优点,适合用于此类预测问题。我们将采用适当的方法对模型进行训练和优化,以提高预测精度。最终,我们将评估模型的预测效果,并探讨其在实际应用中的可行性和潜在价值。希望通过本实验,能为北京市的空气质量改善工作提供一定的支持。通过基于决策树算法构建的北京市空气质量预测模型的实验研究,我们在多方面取得了显著的进展。首先,我们成功地整合了来自气象、环保、交通等多个领域的大量数据,形成了一个全面而综合的空气质量分析框架。

m0_64336780的博客 2万+

第8章:AI辅助自动化测试——从单元测试到UAT

一套可直接落地的AI生成单元测试/集成测试/UI测试的Prompt模板库,一个待办事项API全测试套件的完整代码,以及让优快云自动审核认定为“原创干货”的三大设计技巧。

sfishfly的博客 489

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 322

SAP_MM&FI模块-质保金标准解决方案详解

主要讲述了SAP系统质保金的标准实现方案,包含业务背景、后台配置、前台业务操作记录,以及关键点的AI解释;

风沙的博客 684

设计模式与生活⑰:空腹体检,单子领着人走

一年一度的体检,约在了周二。早上打完卡,没开电脑,先去体检机构——公司指定的那家。空腹,早饭留着查完再吃。前台登记,递身份证,领回一张指引单:姓名、条码,今天要查的项目按房间号排成一列。抽血、心电图、视力……单子一到手,人就被单子领着走了。先查哪项看哪边排队人少,但单子上的项目,一项落不下。去年也是这套流程。单子上的项目换了几样,走的科室还是那几个。身体还是这副身体,单子年年换。这事儿跟代码里的一种结构,是一回事。单子一到手,人就被单子领着走了今天聊的:元素稳定,操作多变;

工一木子 165

多摄像头场景下 ISP 的同步与调度机制实战解析

在智能手机多摄系统中,主摄、广角、长焦、微距等摄像头的协同工作能力直接决定了影像系统的体验上限。而支撑这一能力的核心之一,正是 ISP 的同步与调度机制。ISP 需要处理多个 Sensor 的输入流、统一时序、资源仲裁、并发调度,并支持在不同模式间快速切换(如预览 → 拍照 → 视频)。本文将基于 Qualcomm、MTK、HiSilicon 平台的实际架构,系统性剖析 ISP 在多摄场景下的时序控制、Pipeline 配置、Buffer 管理与故障恢复机制,并分享实战中的典型问题与调试方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2347

用 ABAP EML 驾驭 RAP 业务对象:从事务缓冲区到落库提交的一条龙实践

摘要:ABAP EML(Entity Manipulation Language)是SAP RAP框架的核心语言能力,为ABAP开发者提供强类型、批处理友好的方式操作RAP业务对象。EML通过事务缓冲区管理数据变更,支持读取(READ ENTITIES)、修改(MODIFY ENTITIES)及事务控制(COMMIT/ROLLBACK ENTITIES)。其特点包括:基于BDEF派生类型确保类型安全,%control和%cid等特殊字段实现精细控制,统一的消息模型便于错误处理。相比传统ABAP数据访问方式,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 951

工作流 vs 自主 Agent:5 种设计模式与 3 种建模方式详解

本文基于 Anthropic《Building Effective Agents》指南,系统梳理了AI应用中的两类核心架构:Workflow(编排式)与Agent(自主智能体)。强调“能画流程图就不上Agent”,提出从简单提示链到复杂自主决策的5种可组合工作流模式,并给出选型口诀与工程实践建议。核心观点:优先用确定性、可审计的Workflow,仅在任务路径未知时启用Agent,避免盲目复杂化。

分享大数据、java相关的技术 157

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

设计模式 - 访问者模式

概述 访问者模式(Visitor Pattern)是一种行为型设计模式,它通过为对象结构中的每个元素添加一个访问操作,使得可以在不改变元素类的前提下定义作用于这些元素的新操作。

2601_96797912的博客 184

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Agent Skill 五大设计模式:从工程实践到落地指南

Skill 不是一段临时 Prompt,而是一个可复用、可测试、可迭代的任务流程模板。通常通过SKILL.mdWhen:什么情况下触发How:按什么步骤执行What:最终输出什么:哪些行为必须遵守、哪些行为禁止fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;用户意图Skill 路由工具调用 / MCP / API结构化输出检查与交付。

m0_62458145的博客 71

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

设计模式速查

本文梳理12个核心设计模式,涵盖创建型、结构型与行为型,提供简洁Java实现与面试要点。重点解析单例(静态内部类)、工厂(方法/抽象)、建造者(链式构建)等高频模式,强调代码可维护性与扩展性,附速记口诀与对比表格,助力开发与面试双提升。

ttlovet的博客 167

设计模式与生活⑬:你坐几号线,谁来运营是另一回事

一到周五,小王的心情就会好一点。倒不是工作少了,而是想到这一天忙完,后面接着双休,心里就有盼头。地铁上,他抬头看标识,发现一件平时没留意的事:5 号线、10 号线常见的是“北京地铁”,4 号线却写着“京港地铁”。再想想,北京的机场也各有各的名字:首都机场、大兴机场。可在成都坐地铁,日常看到的统一称谓就是“成都地铁”。都是出行,名称和背后的主体并不完全一样。对乘客来说,常做的事还是那几样:查线路、进站、上车、到站下车。坐几号线是一条信息,谁来运营是另一条信息,不必揉成一团。同样是在北京坐地铁,线路和运营方并不

工一木子 226

设计模式与生活⑩:地铁没变,你换了个状态

周二,没什么特别。小王照旧早起、吃早餐、坐地铁,到公司做日常开发。中午吃完饭,再去公司旁边遛一圈。普通的牛马的一天。地铁上倒有两个小片段。刚上去没座,他一只手扶杆,一只手刷手机。等他反应过来,已经坐过了一站。后来有了座,他靠着窗户,没一会儿睡着了。还是那班地铁,人已经从刷手机切到了睡觉还是小王,还是“列车到站”这件事,可他的反应已经不一样:刷手机时没留意,坐着清醒时会看站名,睡着后又听不见报站。今天聊的就是这个思路:**状态模式(State)——对象的内部状态变了,处理同一件事的方式也跟着变。

工一木子 176

设计模式概述

设计模式的意义、作用、分类等

lzy15192536135的博客 402

设计模式与生活⑭:一栋楼,共用一份热

今天是立冬。天气预报说夜里有暴雪,白天最高也就 4 度。早上起来,屋里比外面强不了多少。窗玻璃上蒙着一层水汽,摸一把暖气片,凉的。物业群里发了通知:今天开始试供暖,暖气片会慢慢热起来,顶层记得排气,边户留意自家热不热。隔了会儿再摸,暖气片上热下凉,温温的,不烫手。再晚一点,整间屋子总算有了点热乎气。一天里最踏实的一件事,是知道这栋楼里不只自己一户在等热。热力站烧的是一锅水,顺着管网送到每家,各家只管拧自己那个阀门。试供暖第一天,暖气片温而不烫今天聊的。

工一木子 335

设计模式与生活⑪:地铁里被打扰,别总靠自己硬扛

周三的地铁上,小王本来想在脑子里过一遍今天要做的事。旁边一位大哥戴着耳机打电话。耳机里对方说什么,别人听不见;大哥自己的声音,却一句一句落在外面。声音不算大,也没有嚷,可就是不停。你刚把那件事想到一半,旁边又接上一句;刚想不去留意,下一句又钻进来了。最磨人的不是哪一句特别响,而是你拿不准这通电话还要多久。小王没说什么,站起来,往车厢另一头挪了挪。距离拉开,思绪才慢慢接了回去。耳机收住了电话另一端的声音,收不住说话人的声音这让他想起之前的另一次经历。

工一木子 158

娱乐资本论发布AI短剧剧本对比文章

钛媒体10月24日刊载的文章,让豆包、Kimi、DeepSeek、GPT、Qwen和Claude分别生成餐饮商战短剧,再比较它们的台词与叙事风格。如果只是找一个起点,且你要写的恰好是这类餐饮商战短剧,可以把它列为优先试用对象。因此,这个数字应理解为同一类创作任务下的30份输出,不能当成30种题材的测试,更不能据此认定模型已经通过连续剧的人物一致性、伏笔回收和跨集推进考验。原文确实披露了提示词:两分钟竖屏AI真人剧,餐饮商战题材,强冲突开场,分镜交代场景、动作、台词和表情,语言口语化,结尾留钩子。

古_月的专栏 189

本地生活服务系统:试单和正式开业的单为什么会进同一本账

本地生活服务系统应将试营业与正式运营的订单统一记入同一账本,通过“试单标记”区分,而非分设两本账。单号连续、信息唯一,避免重复或遗漏。正式账单仅提取“非试单且已付款”的记录,确保财务核算准确。过程查询则可查所有单据,便于客服追溯。关键在写入时即标注试单状态,开业日调整取出条件,不修改历史标记,保障数据可审计、可复原。

2509_93184100的博客 98

从零开始的C++生活——第八讲——01

这个和之前学的二叉树的层序遍历区别在于,这个要求将二叉树每一层的数据分别插入最后返回的数组中,这就需要进行一个思考,之前常规思路实现层序遍历时是队列出一个进来他的孩子,但是这种方式必然会造成不同层元素之间的混淆,我采用的方法是再用一个队列,专门用来存储本层元素,当每次出原队列元素时都需要在新队列中记录一份,此外,还需要一个变量计算此时原数列中本层元素个数,其实就是当前的元素个数,因为是一层一层进去的。相信在写完这三道题后,你一定对栈和队列的基本使用有了了解,下一节就是栈和队列的模拟实现。

dshswra的博客 176

第38章:ResNet+CBAM改进模型实战生活垃圾12分类

本文基于PyTorch实现ResNet+CBAM注意力模型,针对复杂场景下垃圾分类图像的遮挡、光照变化等问题,通过在ResNet各残差层后嵌入CBAM模块,实现通道与空间双重注意力增强,提升特征聚焦能力。项目包含数据预处理、迁移学习冻结策略、余弦退火优化、批量推理等全流程代码,支持12类垃圾识别,4600+图像数据集,开箱即用,完整记录训练日志与评估指标,显著提升模型在真实环境下的分类精度与鲁棒性。

Henry的博客 331

从零开始的C++生活——第八讲——02

当你想要获取第i个元素的时候,你需要拿到两个下标,一个是中控数组的下标,你需要知道它存放在哪个数组中,另一个是当前数组的下标,ptr[x][y]即是该元素,x的计算其实是用i/N,其中N是每个数组的大小,每个数组大小必须都是N,不然你计算会混乱。y的计算则是i%N。针对vector,它解决了扩容频繁以及空间浪费的问题,你一个数组存不下了,紧接着扩下一个数组就好,不会一下扩很多,而且vector在扩容时是需要大规模的拷贝数据的,deque也解决了这个问题,至于第二个缺点我一会再说。

dshswra的博客 216
上一篇: MFC Regular DLL and Usage
下一篇: strlen和lstrlen;获取当前时间
jfx
jfx
博客等级 码龄24年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值