当前位置: 首页 > news >正文

【C/C++语言系列】实现单例模式

1.单例模式概念

定义:单例模式是一种常见的设计模式,它可以保证系统中一个类只有一个实例,而且该实例易于外界访问(一个类一个对象,共享这个对象)。
条件

  1. 只有1个对象
  2. 易于外界访问
  3. 共享这个对象

使用情况:如果希望某个类只有一个对象,就可以使用单例模式。
**案例:**windows的任务管理器,可以重复打开,但是只会出现一个

2.代码分步骤编写

class Person{};void test(){Person p1;Person p2;Person p3 = new Person;
}

正常代码框架如上所示,这样这个类就不止一个对象的,所以第一步:

  1. 将默认构造函数私有化:防止创建多个对象
class Person{
private:Person(){};
};void test(){//Person p1;   //默认构造函数私有化,都不能创建了//Person p2;//Person* p3 = new Person;  
}

但是这样一个对象都没有了

  1. 只要拿到一个对象的指针即可,这个指针指向唯一的对象
class Person{
private:Person(){};
public:   //这个指针容易外界访问static Person* person;  //唯一(静态)的对象指针
};
Person* Person::person = new Person;   //静态变量实现(类内不管权限都能调用构造函数)
void test(){Person* c1 = Person::person;  //c1 == c2,它们指向相同Person* c2 = Person::person;
}

但是会出现一个问题:

c1 = NULL; //或者
Person::person = NULL;

那么这个类就访问不到了,因为权限太高,可以使用get、set方法。

  1. 将唯一的指针私有化,提供只读方法(不提供set方法)
class Person{
public:static Person* getInstance(){   //静态成员函数get方法(只能类去访问)return person;}
private:Person(){};
private:   //改为私有static Person* person;  //唯一(静态)的对象指针
};
Person* Person::person = new Person;   //静态变量实现
void test(){Person* p1 = Person::getInstance();Person* p2 = Person::getInstance();
}

但会出现以下问题:

Person* p3 = new Person(*p1); //拷贝构造,p3 != P1产生了新的对象
  1. 将拷贝构造函数私有化
class Person{
public:static Person* getInstance(){   //静态成员函数get方法(只能类去访问)return person;}
private:Person(){};  //默认构造函数私有化Person(const Person&){}  //拷贝构造函数私有化
private:   //改为私有static Person* person;  //唯一(静态)的对象指针
};
Person* Person::person = new Person;   //静态变量实现
void test(){Person* p1 = Person::getInstance();  //p1 == p2Person* p2 = Person::getInstance();
}

总结

单例模式是一种常见的设计模式,我们需要掌握它,熟练了可以直接看最后一步的代码。一个补充,单例对象在main函数调用之前生成了(静态变量在编译阶段就分配了内存)

http://www.lryc.cn/news/442533.html

相关文章:

  • A. Make All Equal
  • 业务安全治理
  • HelpLook VS GitBook,在线文档管理工具对比
  • docker面经
  • Python 中的 Kombu 类库
  • safepoint是什么?有什么用?
  • axios相关知识点
  • LeetCode 面试经典150题 67.二进制求和
  • Dell PowerEdge 网络恢复笔记
  • Java面试——集合篇
  • 算法【双向广搜】
  • javascript检测数据类型的方法
  • 生信初学者教程(五):R语言基础
  • 深度学习计算
  • Hexo博客私有部署Twikoo评论系统并迁移评论记录(自定义邮件回复模板)
  • Vue.js 与 Flask/Django 后端配合:构建现代 Web 应用的最佳实践
  • 【笔记】自动驾驶预测与决策规划_Part3_路径与轨迹规划
  • Shiro-721—漏洞分析(CVE-2019-12422)
  • 【Python语言初识(一)】
  • Python 中的方法解析顺序(MRO)
  • MySQL表的内外连接
  • 系统架构设计师:软件架构的演化和维护
  • QT的dropEvent函数进入不了
  • Spring Boot 入门
  • LDD学习2--Scull(TODO)
  • 【算法-堆排序】
  • 音视频入门基础:AAC专题(4)——ADTS格式的AAC裸流实例分析
  • 【第33章】Spring Cloud之SkyWalking服务链路追踪
  • 如何选择OS--Linux不同Distribution的选用
  • cesium效果不酷炫怎么办--增加渲染器