餐馆那些事之:Singleton Pattern

本文介绍了Singleton设计模式的概念,通过一个简单的餐馆菜单示例展示了如何实现类的唯一实例,并确保该实例能在系统的不同部分被访问。此外,还详细解释了Singleton模式的三个关键组成部分:私有构造函数、静态成员函数及静态局部变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概念
If a system only needs one instance of a class, and that instanceneeds to be accessible in many different parts of a system, you control both instantiation and access by making that class a singleton.

两个点:类的唯一实例和需要在多处被访问,这就是singleton模式的精髓。
singleton是最简单的设计模式,其应用意义在于全局保存类的唯一实例。最常见的应用是配置文件,配置文件常常是多个处理线程共用一份配置文件,全局只要存在一份配置文件即可。

2. 实例
小餐馆常常在墙上贴一个大菜单,顾客看下大菜单就能点菜,此处,这个大菜单就可以应用singleton模式,code:
Big_menu.h

class Big_menu { public: // @brief 获取实例 static Big_menu& instance(); // @brief 看菜单咯 void noodles(); private: //构造函数私有化,这个很重要哟 Big_menu(void); ~Big_menu(void); };Big_munu.cpp

#include <iostream> #include "Big_menu.h" Big_menu::Big_menu(void) { } Big_menu::~Big_menu(void) { } Big_menu& Big_menu::instance() { static Big_menu big_menu; return big_menu; } void Big_menu::noodles() { std::cout << "------------------------------------------" << std::endl; std::cout << "-----------红烧牛肉拉面 10元--------------" << std::endl; std::cout << "-----------红烧羊肉拉面 10元--------------" << std::endl; std::cout << "------------------------------------------" << std::endl; }

测试:
#include <iostream> #include "Big_menu.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //Big_menu big_menu; //报错:error C2248: “Big_menu::Big_menu”: 无法访问 private 成员(在“Big_menu”类中声明) Big_menu::instance().noodles(); //work well system("pause"); return 0; }

输出:

------------------------------------------
-----------红烧牛肉拉面 10元------
-----------红烧羊肉拉面 10元------
------------------------------------------

分析:

1)构造函数私有化
通过私有化构造函数,使用户无法直接构造对象

2)静态成员函数instance
静态成员函数与对象无关,通过类名称+域区分符+函数名就能调用静态函数。

3)静态局部变量big_menu
在静态成员函数instance中定义静态局部变量big_menu,静态局部变量仅分配一次内存,函数返回后,该变量不会消失

通过上述3部分组合,使得类实例全局唯一

3. 总结
单件模式在实际项目中大量使用,是必须要掌握的设计模式之一


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值