网站首页 > 技术文章 正文
25.1 单例模式的写法及设计思路
单例模式需求:只能创建一个对象
对象具有共享属性(你也可以创建多个对象,但他们本质上是同一个)
****************************************************************************************
写法:
私有权限: 默认构造函数、 拷贝构造函数、 静态的对象指针(类内声明,类外初始化)
公共权限:提供 静态 get 接口 让用户获得对象指针
static Printer * getInstance() // 返回值类型(静态的对象指针)、 getInstance() 实例化接口
{
return 单例对象指针;
}
用法:通过类名访问
设计思路:
问题:普通类会可以创建多个对象,不符合单例的唯一共享性
解决: 将默认构造函数私有化
---------------------------------------------------------------------------------------------------------------------------------
问题:一个对象都创建不起来了
解决: 维护一个对象指针即可,并且使该指针静态,实现唯一、共享 (类内声明,类外初始化)
---------------------------------------------------------------------------------------------------------------------------------
问题:指针公共权限,用户可能误操作(比如:使唯一的指针置空)
解决: 将静态对象指针私有化
---------------------------------------------------------------------------------------------------------------------------------
问题:对象指针不可访问
解决: 在公共权限下提供“接口函数”,让用户获得唯一的对象指针,而不能改变对象指针
---------------------------------------------------------------------------------------------------------------------------------
问题:一开始,私有化默认构造函数,则不能实例化对象,无法通过对象调用“接口函数”
解决: 将“接口函数”设为静态(可以通过类名调用)
---------------------------------------------------------------------------------------------------------------------------------
问题:仍然可以使用拷贝构造函数,创建新的对象指针
解决: 将拷贝构造函数私有化
25.2 编写一个单例模式
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string>
// 创建一个打印机的单类模式
class Printer
{
//成员功能函数
public:
void PrintTxt(string txt) //打印功能
{
cout << txt << endl;
}
// 实现单例模式
public:
static Printer* getInstance()
{
return p; // 公共权限内开放静态化实例化接口,使用户获得单利模式下的对象
}
private:
Printer(){} // 私有化默认构造函数
Printer(const Printer &p) {} // 私有化拷贝构造函数
static Printer * p; // 声明静态对象指针
};
Printer * Printer::p = new Printer; // 类外通过 new 的方式初始化静态对象指针
****************************************************************************************
void test()
{
Printer* p1 = Printer::getInstance(); // 无法创建对象,只能通过类名访问创建
Printer* p2 = Printer::getInstance();
if (p1 == p2) {
cout << "p1和p2相同" << endl; // 结果:相同 p1、 p2指向同一内存,复合单例模式
}
else {
cout << "p1和p2不同" << endl;
}
// 注意: Printer * p3 = p1->getInstance(); 以此种方式创建的p3也和p1、 p2相同
p1->PrintTxt("hello"); // 打印字符串 hello
p2->PrintTxt("world");
}
****************************************************************************************
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
猜你喜欢
- 2024-09-24 学习C++之良好的编程习惯与编程要点
- 2024-09-24 大一萌新看过来,“这样”学C++,让你不再迷茫
- 2024-09-24 学习单例模式引发的思考
- 2024-09-24 C++中相互依赖的全局变量初始化策略
- 2024-09-24 零基础学习C++
- 2024-09-24 c++的面试总结
- 2024-09-24 避免踩坑,C++常见面试题的分析与解答
- 2024-09-24 20道必须掌握的C++题,纸上谈兵惯用伎俩
- 2024-09-24 C++11魔法静态变量magic static
- 2024-09-24 C++11 中值得关注的几大变化
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)