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

射频功率放大器设计实战:从理论到Layout的全流程解析 本文以一款40W、960MHz LDMOS功率放大器为例,系统解析了从理论分析、仿真设计到版图实现的射频功率放大器设计全流程。内容涵盖AB类放大器选型、核心指标定义、稳定性分析、Load-Pull/源牵引仿真、史密斯圆图匹配、偏置网络设计,以及最终的谐波平衡仿真与版图电磁验证,为工程师提供了一套从理论到实践的完整设计方法论。 阅读详情
 

下载源代码



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

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;
}
  文章到此结束,如有不妥之处,请来信告知。

参考文献:
  1.《设计模式-可复用面向对象软件的基础》-- 李英军等译
  2.《深入浅出设计模式》-- Eric Freeman,Elisabeth Freeman,^Kathy Sierra & Bert Bates著
大众点评商家及评分数据(2012-2025) 大众点评及商家评分数据库全面覆盖全国范围内多个城市的商户信息,涵盖餐饮、购物、休闲娱乐等多个消费领域,包含商家基础信息、地理坐标、分类体系、经营状态、用户评价、消费水平及服务设施等共计28个字段。 阅读详情

相关推荐

CMU的local_planner学习笔记

ros::Subscriber subOdometry = nh.subscribe//当接收到/state_estimation话题消息更新时启动odometryHandler回调函数 (消息格式:nav_msgs::Odometry消息内容:关于机器人或车辆的位置和方向(姿态)信息)pcl::PointCloud::Ptr freePaths(new pcl::PointCloud());

qq_35971623的博客 3876

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

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

jfx的专栏 730

基于STM32的Keil5代码自动补全设置操作指南

掌握Keil5代码自动补全设置技巧,提升STM32开发效率。通过合理配置编辑器选项,实现智能提示与语法补全,让嵌入式编程更流畅,尤其适合使用keil5代码自动补全设置的开发者快速上手。

weixin_32287387的博客 762

单件模式之可乐瓶实现

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

GZFStudy的专栏 1119

支持找回微信删除好友!一款人人可用的全能微信数据分析工具

找回删除好友、查看删除记录、恢复聊天信息....

1725

基于STM32设计的智能水产养殖系统(华为云IOT)(152)

当前设计的智能水产养殖系统主控芯片采用STM32F103RCT6,可以实现对水位、水温、水混浊度和PH值等参数的监测和控制,并且支持定时投喂功能。通过连接华为云物联网平台,将传感器数据上传到服务器,并通过Qt设计的Android手机APP来获取设备上传的数据,从而实现对养殖环境的远程监测和控制。

8826

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

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

weixin_52400878的博客 317

Python爬虫实战:美团商家数据采集系统

本文将详细介绍如何使用Python最新技术栈构建高效的美团商家信息采集系统。内容涵盖异步爬虫、反爬对抗、数据存储、可视化分析等完整流程,提供可落地的代码方案和工程实践。

2201_76125261的博客 2658

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

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

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

采用了fluent模拟了平壁面结霜过程。udf,很经典,可以试试。

利用该模型作为FLUENT中的源项,模拟了在局部冷却下冷表面上的霜形成,以预测霜的形态、温度分布和霜的重量,结果与实验结果吻合良好。结果显示,霜首先围绕冷却块形成,然后逐渐向其他方向扩展,冷却块上方的霜密度最大。随着时间的推移,平均霜厚度逐渐增加,生长速率减慢,而平均霜密度随增长速率变快而增加。相变传递微观过程与机理、蒸发及冷凝换热、强化传热、高效传热管、热泵、制冷、节水节能新技术、电子元器件冷却、余热回收及梯级利用等。udf,很经典,可以试试。工程热物理、空调、热能、低温制冷、化工、物理等。

qq_15963745的博客 920

【ComfyUI】QwenImageEdit OOTD角色与姿态匹配换装

本文介绍了一个基于Qwen Edit OOTD 2.0的ComfyUI工作流,能够实现角色与姿态匹配的智能穿搭生成。该工作流通过整合模型推理、姿态识别、图像拼接和渲染等节点,完成从角色图、姿态图到成品穿搭图的完整生成流程。核心采用Qwen Image系列模型进行图像理解和编辑,配合ControlNet进行姿态引导。用户只需提供角色图和姿态参考图,系统即可自动完成姿态解析、语义编码、采样生成等步骤,输出与输入姿态一致的穿搭图像。该方案适用于虚拟角色展示、电商试穿等场景,能保持角色特征一致的同时灵活变换姿态,显

Mr数据杨 1582

设计模式 - 访问者模式

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

2601_96797912的博客 178

大数据与宠物:健康监测数据分析

随着全球宠物市场规模的快速增长(2023年全球宠物产业规模已达3500亿美元),宠物健康管理需求呈现指数级上升。传统宠物医疗依赖定期体检和症状观察,存在滞后性和主观性缺陷。本文聚焦如何通过物联网(IoT)设备采集宠物生理数据(体温、心率、活动量等),利用大数据分析技术构建实时健康监测系统,实现宠物健康状态的动态评估、异常预警和疾病预测。研究范围涵盖数据采集技术、数据预处理方法、机器学习模型构建及实际应用场景落地。背景介绍:明确研究目的、目标读者及核心术语核心概念与联系。

2502_91592937的博客 1067

设计模式速查

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

ttlovet的博客 161

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

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

工一木子 220

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【第四部分:Agentic 智能体设计模式】17. Agent 路由模式详解:从意图识别到动态模型选择

本文介绍 Agent Routing(路由模式)的基本原理与工程实现,重点分析任务路由、模型路由、工具路由和专业 Agent 路由的区别及适用场景。结合 BaseMetas EKA 企业知识助手,介绍规则与模型混合路由、Java Router 实现、复合任务处理、低置信度兜底和误路由评估,并以 Jev 专用决策模型、动态模型选择及 Tool Search 等近期技术为例,说明如何在保证权限与执行安全的前提下,提高 Agent 任务分发的准确性和效率。

weixin_42258782的博客 627

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

工一木子 174

设计模式概述

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

lzy15192536135的博客 397

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

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

工一木子 320

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

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

工一木子 154

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

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

古_月的专栏 187

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

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

2509_93184100的博客 87

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

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

dshswra的博客 173

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

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

dshswra的博客 207

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

关于迭代器,由于你要进行操作符重载,所以我选择封装一个迭代器类,从底层的角度思考,你拿到任意一个类型的迭代器一般都是要访问迭代器所指向的空间的成员,所以我们其实应该拿到迭代器所指向节点的值,因此这也是一个模板类,而且,我们要对迭代器的解引用操作符和->操作符进行重载,重载即是分别拿到对应的值以及对应值的地址,除此之外,在遍历过程中我们需要对迭代器进行比较,因此需要重载==!增加的模板参数一个传T的引用,一个传T的地址,而const类型的迭代器则是传const T&和const T*。

dshswra的博客 75

生活服务小程序开发案例:按行业接单、虚拟拨号与原服务人员复购

一次生活服务完成后,用户再次产生需求时,可能希望由熟悉情况的服务人员继续提供服务。平台需要处理的,不只是“再次下单”,还包括原服务人员是否愿意接单、拒绝后订单如何继续流转,以及服务完成后的评价和收益结算。围绕某公司的生活服务业务需求,海拔网络开展了一套微信小程序的定制开发,将服务预约、人员认证、行业接单、虚拟拨号、用户确认开始服务、评价和复购连接起来。本项目同时考虑首次预约与再次预约。普通订单进入接单大厅,由对应行业的服务人员承接;

haibawangluo的博客 192
上一篇: 英中术语对照
下一篇: 如何往IE工具条添加按钮
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值