单例模式 + 工厂函数

news/2025/10/7 23:42:48/文章来源:https://www.cnblogs.com/hshy/p/19129029

单例模式 + 工厂函数

#include "CRenderDevice.h"
#include "CRenderDevice_Renderware.h"static CRenderDevice* g_pRenderDevice = NULL;
static stRenderDeivceSettings g_stDeviceSettings;CRenderDevice* CRenderDevice::GetRenderDevice( char* pRenderDeviceName )
{if( !pRenderDeviceName ) return g_pRenderDevice;if( !g_pRenderDevice ){if( strcmp( pRenderDeviceName, "Renderware" ) == 0 ){g_pRenderDevice = new CRenderDevice_Renderware;if( !g_pRenderDevice->OnCreate( &g_stDeviceSettings ) ){
#ifdef _DEBUGOutputDebugString( "Failed to create render device. ( CRenderDevice::OnCreate() )\n" );
#endif}}}return g_pRenderDevice;
}CRenderDevice::CRenderDevice( void )
{
}CRenderDevice::~CRenderDevice( void )
{
}BOOL CRenderDevice::OnCreate( stRenderDeivceSettings* pDeviceSettings )
{if( !pDeviceSettings ) return FALSE;if( !pDeviceSettings->m_hWnd ) return FALSE;memcpy( &m_DefaultSettings, pDeviceSettings, sizeof( stRenderDeivceSettings ) );return TRUE;
}BOOL CRenderDevice::OnDestroy( void )
{return TRUE;
}

1. 全局变量

 
static CRenderDevice* g_pRenderDevice = NULL; static stRenderDeivceSettings g_stDeviceSettings;
  • g_pRenderDevice
    保存全局唯一的渲染设备实例(单例风格)。

  • g_stDeviceSettings
    保存全局的设备设置(分辨率、窗口句柄、颜色等)。

👉 说明 CRenderDevice 采用了 单例模式 + 工厂函数 的设计。


2. CRenderDevice::GetRenderDevice

 
CRenderDevice* CRenderDevice::GetRenderDevice(char* pRenderDeviceName)

逻辑分支:

  1. 如果 pRenderDeviceName == NULL

    • 直接返回当前全局实例 g_pRenderDevice

  2. 如果还没有创建设备 (!g_pRenderDevice)

    • 检查名字是否是 "Renderware"

    • 如果是,则 new CRenderDevice_Renderware

    • 调用 OnCreate(&g_stDeviceSettings) 进行初始化。

    • 如果失败,在 Debug 模式下输出错误字符串。

返回:全局的 g_pRenderDevice

👉 这就是一个 静态工厂方法,支持根据名字创建不同的渲染设备实例。
比如未来可以扩展成:

 
if(strcmp(pRenderDeviceName, "Direct3D9") == 0) { g_pRenderDevice = new CRenderDevice_D3D9; }

3. CRenderDevice 构造/析构

 
CRenderDevice::CRenderDevice(void) {} CRenderDevice::~CRenderDevice(void) {}
  • 空实现,基类只是提供统一接口。


4. CRenderDevice::OnCreate

 
BOOL CRenderDevice::OnCreate(stRenderDeivceSettings* pDeviceSettings) {if (!pDeviceSettings) return FALSE;if (!pDeviceSettings->m_hWnd) return FALSE;memcpy(&m_DefaultSettings, pDeviceSettings, sizeof(stRenderDeivceSettings));return TRUE; }
  • 检查传入的设备设置是否有效(窗口句柄必须存在)。

  • 拷贝一份配置到 m_DefaultSettings

  • 返回 TRUE 表示成功。

👉 这是基类的默认实现,子类(如 CRenderDevice_Renderware)会在它的 OnCreate先调用基类的 OnCreate,再做自己的渲染 API 初始化。


5. CRenderDevice::OnDestroy

 
BOOL CRenderDevice::OnDestroy(void) {return TRUE; }
  • 默认啥也不干,返回 TRUE。

  • 子类可以 override 来清理资源(比如 RwEngineClose / RwEngineTerm)。


6. 总体流程

当外部调用:

 
CRenderDevice* pDevice = CRenderDevice::GetRenderDevice("Renderware");

执行流程是:

  1. 工厂方法检查 g_pRenderDevice 是否已存在。

  2. 没有 → 创建一个 CRenderDevice_Renderware

  3. 调用 OnCreate(&g_stDeviceSettings),初始化 RenderWare。

  4. 成功则返回设备实例。

以后别的地方调用 GetRenderDevice(NULL) 就能拿到这个全局唯一的设备指针。


总结一句话
这段代码实现了 渲染设备的单例工厂。默认支持 "Renderware",以后可以扩展 "Direct3D9""OpenGL",而基类 CRenderDevice 提供了基础的参数拷贝和接口框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站建设费用预算wordpress 页面内存大

vue3vitets 开发浙里办H5应用流程和注意事项 最近有个项目是要开发到浙里办的一个H5项目,记录一些问题; 浙里办irs系统内node版本和npm版本如下建议切到他们的版本再进行开发这样问题少一点 1.因为浙里办有自己的irs系统 需要吧前端整体的代码传上去 除了 打包后的dist 和 no…

没钱怎么做网站信息网站方案

各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛ 💡spr…

垡头做网站的公司网站制作怎样做背景

[摘要] Timer是实时操作系统的一个重要组成部分。本文结合近阶段的学习和实验情况,对VxWorks中的时间函数和定时器作了一些探讨。主要介绍了Timer的机制,相关的函数,并给出了一些具体的例子。 一. Tick Tick是指每秒中定时器中断的次数。POS…

Ambari安装Hadoop

Ambari界面安装Hadoop集群及其他的组件 Ambari的Web页面安装Hadoop 登入及定义集群名称 使用初始的:admin/admin账号登入到Ambari上,启动安装程序,之后输入集群的名称。bigtop选择组件清单 在这一步选择默认的bigto…

Ambari-bigtop搭建hadoop数据仓库架构

Ambari-bigtop搭建hadoop数据仓库架构我将这些组件分为几大类以便理解:核心存储与资源管理(数据湖基石) HDFS (Hadoop Distributed File System): 分布式文件系统,是整个大数据平台的存储基石。它将以块的形式将海…

安装Ambari集群

1、前置要求 系统环境 系统:4 * Rocky Linux9.6-x86_64-minim 内存:12GB (12288MB) CPU:6 虚拟核 存储:150G 组件: ①Apache Ambari 3.0.0 ②Apache Bigtop 3.3.0 对应的下载链接: Rocky Linux: https://rockyli…

POLIR-Society-Philosophy-Hegels System of Science

POLIR-Society-Philosophy-Hegels System of Science hegel.net - Hegels System of Science, religion and philosophy, philosophy of religion SearchHegels System of Science Enyclopedia Britannica 1911 [PDF V…

Python中的`namedtuple`:命名元组的用法与优势

Python中的namedtuple:命名元组的用法与优势 collections.namedtuple是Python标准库提供的一个实用工具,它创建的是一种带字段名的元组,兼具元组的不可变性和类的可读性,是处理简单数据结构的理想选择。 一、named…

android开发者网站中国最近战争新闻

CortexM3存储器系统 宗旨:技术的学习是有限的,分享的精神是无限的。 CM3 只有一个单一固定的存储器映射。这一点极大地方便了软件在各种 CM3 单片机间的移植。 存储空间的一些位置用于调试组件等私有外设,这个地址段被称为“私有外设区”。私…

一摞python风格的纸牌

一摞python风格的纸牌 import collections# 定义卡牌类 Card = collections.namedtuple(Card, [rank, suit])# 法式扑克牌类 class FrenchDeck:ranks = [str(n) for n in range(2, 11)] + list(JQKA)suits = spades di…

记录一个ubuntu24.04蓝牙不显示不可用的解决方案

记录一个奇怪的ubuntu24.04桌面端的蓝牙标志消失处理办法 现象: 1.蓝牙开关消失,提示plug in a dongle to use bluetooth 2.服务日志提示:Bluetooth service was skipped because of an unmet condition check (Con…

网站开发电脑配置推荐网站流量 seo

客户简介 岗岭集团是中国互联网医药健康的领军企业,致力于用互联网模式和思维方式,改变中国大众“看病难、买药贵”的现状。岗岭集团运用创新的互联网和IT技术提供在线诊疗、购药和健康管理等服务,缩减中间环节,优化供应链&#…

社区门户网站建设方案雅式机械加工网

当我们找工作的时候查看招聘信息发现都需要有自动化测试经验,由此看来测试人员不会一点自动化测试技术都不好意思说自己是做软件测试的。大部分测试人员也都是从使用自动化测试工具、录制回放、测试脚本、开发小工具入门自动化测试的,然后在慢慢的接触 U…

惠州模板网站WordPress wlw设置

简单的说time()与$_SERVER["REQUEST_TIME"]都是获得时间的,但time返回当前的 Unix 时间戳而$_SERVER["REQUEST_TIME"]得到请求开始时的时间戳,稍有区别。1. time() 获取当前的系统时间戳inttime( void ) :返回自从 Unix 纪元(格林威…

directx 与d3d 什么关系

directx 与d3d 什么关系1. DirectX 是一个“套件”DirectX (Direct eXtension) 不是单一库,而是 微软在 Windows 平台上提供的一整套多媒体 API。主要模块包括:Direct3D (D3D) → 3D 图形DirectDraw → 2D 图形(后来…

数据仓库中的“时间旅行者”:深入理解渐变维度(SCD)与拉链表

某电商平台的用户“小美”昨天刚从上海搬到北京,现在住在北京的一家单身公寓里。“小美” 很热爱生活,喜欢烘培烹饪、逛展会、户外旅行等活动。为了满足自己的个性化需求,她选择成为一名电商“重度使用者”。她尤其…

MOVEit网络攻击波及普华永道与安永,供应链安全再响警钟

勒索软件团伙Clop利用MOVEit文件传输服务的零日漏洞发起供应链攻击,导致普华永道、安永等多家知名机构数据泄露。攻击者要求受害企业在6月14日前支付赎金,美国网络安全机构已发布安全补丁。MOVEit网络攻击波及普华永…

Penchick Online Mathematical Olympiad, Qualifying Test 1, III.4

原题链接:https://artofproblemsolving.com/community/c4h3687790_1st_penchick_online_mathematical_olympiad_qualifying_test_1_iii4 解答: 令 , . (统一分母)整理得:代入原式 均值不等式(AM-GM)得到最小 , …

自己做网站别人怎么看见wordpress搬家后全部页面404

目录 1.hdfs读写流程解析 2.hdfs副本机制,三副本原因,副本存放策略 3.hdfs容错机制原理 4.MapReduce执行流程详解 5.spark和mr的区别 6.TopN求法,大数据量无法完全写入内存解决方案,MapReduce实现方法 7.spark部署、调度原…

QBXT2025S刷题 Day6

T2 这道题是树形 \(\mathcal{DP}\),我们注意到如果一个点能和他的一个子树合并成为一个三叉,那么可以是以下四种情况。然后我们的状态记录一下当前有 \(i\) 个链,\(j\) 个倒 "Y"。 这样,我们可以先让 \(…