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

分享常用设计模式之单例模式(懒汉模式和饿汉模式)和几种关于设计模式的面试题

目录

1.单例模式

1.懒汉模式

2.饿汉模式

2.设计一个不能被继承的类

3.设计一个不能被继承但是可以在外部环境创建该类对象的类

4.设计一个可以被继承但不能在外部环境创建该类的对象的类

5.限制派生类对象不能拷贝也不能赋值


1.单例模式

设计一个不能在外部环境创建该类的对象的一个类,只能创建一个就是单例模式,这里其实是写了一个饿汉模式

class Singleton
{int value;
private:Singleton(int x = 0) :value(x) {}Singleton(const Singleton&) = delete;//删除的函数放共有私有都行Singleton& operator=(const Singleton&) = delete;~Singleton() { cout << "~~~~" << endl; };//因为唯一的对象s是该类域中的,所有可以调共有私有以及保护的方法
public:static Singleton& getInstance(){static Singleton s(10);//构建static的对象,因为它被类的所有成员函数和子类共有return s;}
};
void main()
{Singleton &s2 =Singleton::getInstance();//不用引用就要调拷贝构造函数,如果只允许创建一个对象,则使用引用接收// s2.~Singleton();//不可以调用,因为s2的作用域是在main函数里面
}

1.懒汉模式

懒汉模式:很“懒”,只有用到了才实例化对象并返回(调用了对外的接口才会实例化对象)。

class singleClass
{
public:static singleClass* getinstance()//对外接口的对象创建方法{if (instance == nullptr){i_mutex.lock();if (instance == nullptr)//判断第二次是因为确保不会因为加锁期间,多个进程进入{instance = new singleClass();}i_mutex.unlock();}return instance;}
private:static singleClass *instance;static mutex i_mutex;singleClass() {};//构造函数
};
void main()
{singleClass* p = singleClass::getinstance();}

2.饿汉模式

不管调不调用对外接口,都已经实例化对象了。

class singleClass
{
public:static singleClass* getinstance(){return instance;}
private:static singleClass* instance;singleClass() {}
};
singleClass* singleClass::instance = new singleClass();//类外初始化void main()
{singleClass* p1 = singleClass::getinstance();singleClass* p2 = singleClass::getinstance();
}

2.设计一个不能被继承的类

思路:当基类的构造函数为私有时,该类则不能被继承,因为无论是何种继承子类只能访问父类的共有和保护成员,当子类的构造函数被调用之前,要先构造基类的构造函数,但这时候无法访问基类的构造函数,所以该基类不能被继承。

class non_herit
{
private:non_herit() {}//只能是保护才有结果
public:non_herit(const non_herit&) {}~non_herit() {}
};
class Base :public non_herit
{
public:Base(const Base& base) :non_herit(base) {}
};void main()
{Base base1;//errorBase base2(base1);//error
}

3.设计一个不能被继承但是可以在外部环境创建该类对象的类

final:代表用该关键词修饰的类是不能派生其他类的,但是向上去继承没有问题

仍然可以在外部环境中创建该类的对象

class non_herit final
{int value;
public:non_herit(int x = 0) :value(x) {}non_herit(const non_herit&) = default;//default是缺省的意思,告诉编译器以默认方式给拷贝构造non_herit& operator = (const non_herit&) = default;~non_herit() {}
};
//class Base :public non_herit//error
//{};
class Base
{};void main()
{non_herit h1(0);Base base;
}

4.设计一个可以被继承但不能在外部环境创建该类的对象的类

思路:将基类的构造函数、拷贝构造函数和赋值运算符重载函数都声明为protcted,因为子类无论是何种继承都可以访问父类的共有和保护,但是外界不能访问保护成员,所以外界不能构建基类的对象,单数该基类可以被继承,子类可以在外部创建自己的对象(构造函数是共有)

子类也是可以进行赋值运算符重载的,因为子类提供的缺省的赋值运算符之中是可以调基类的赋值运算符重载的,因为基类的赋值运算符是保护属性,可以在子类中被访问

拷贝构造也可以原因同上

class Object
{
protected:Object() {}Object(const Object& obj){}Object& operator=(const Object& obj) {return *this;}
public:~Object() {}};
class Base :public Object
{
public:Base() {}
};int main()
{// Object obj;//errorBase ba;//right
}

5.限制派生类对象不能拷贝也不能赋值

思路:设计一个不能被拷贝和赋值的类,也就是把基类的拷贝和赋值删掉,如果有子类继承自这个基类,那么他也不能拷贝和赋值,但是前提是子类不能重写拷贝和赋值,如果重写那么基类这个限制就没有了 ,原本编译器为子类提供的缺省拷贝和赋值是必须要调基类的拷贝和赋值的,但是基类已经删了,那么基于这样的规则子类就不能拷贝和赋值了。

class noncopyable
{
public:noncopyable() = default;~noncopyable() = default;
protected:noncopyable(const noncopyable&) = delete;noncopyable& operator=(const noncopyable&) = delete;
};class Point :public noncopyable
{};
class Circle :public noncopyable
{};void main()
{Point p1();Point p2();// p1 = p2;//error//Point p3(p1);//error
}

相关文章:

分享常用设计模式之单例模式(懒汉模式和饿汉模式)和几种关于设计模式的面试题

目录 1.单例模式 1.懒汉模式 2.饿汉模式 2.设计一个不能被继承的类 3.设计一个不能被继承但是可以在外部环境创建该类对象的类 4.设计一个可以被继承但不能在外部环境创建该类的对象的类 5.限制派生类对象不能拷贝也不能赋值 1.单例模式 设计一个不能在外部环境创建该类…...

python每日一题——6三数之和

题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 …...

黑马点评笔记 分布式锁

文章目录 分布式锁基本原理和实现方式对比Redis分布式锁的实现核心思路实现分布式锁版本一Redis分布式锁误删情况说明解决Redis分布式锁误删问题分布式锁的原子性问题分布式锁-Redission分布式锁-redission可重入锁原理分布式锁-redission锁重试和WatchDog机制分布式锁-redissi…...

java---抽象类 用abstract修饰

抽象类是不能被[ 直接 ] [ 显式 ]实例化的如果抽象类中有一个抽象方法,那么这个类一定要声明为抽象类(反过来说,如果一个类是抽象类,那么它里面可以没有抽象方法)如果父类中有一个抽象方法,那么抽象的子类,要么也得是抽象的,要么就把抽象的方法全部给具体化(实现了) 抽象方法 …...

JVM 之 javac、java、javap 命令详解

目录 一. 前言 二. javac 命令 三. java 命令 四. javap 命令 一. 前言 在日常工作中&#xff0c;我们新建 Java工程&#xff0c;写好代码后&#xff0c;编译和运行几乎都是通过 IDE&#xff08;如idea、eclipse&#xff09;工具完成。但作为 Java开发者还是要了解下 Java虚…...

市场被套牢,没有了解积累和分配,昂首资本一一介绍

很多投资者对市场中的积累和分配的概念不是很清楚&#xff0c;下面昂首资本将一一介绍。 积累意味着尽可能多地买入筹码&#xff0c;而不大幅抬高价格&#xff0c;直到在你买入时的价格水平上没有或几乎没有筹码。这种买入通常发生在市场熊市之后&#xff0c;此时有最佳买入价…...

notion 3.0.0 版本最新桌面端汉化教程,支持MAC和WIN版本

notion客户端汉化&#xff08;目前版本3.0.0&#xff09; 最近notion桌面端更新了3.0.0版本后会导致老版本汉化失效&#xff0c;本项目实现了最新版Notion桌面端的汉化。 文件下载地址&#xff1a;汉化文件下载地址 项目说明 本项目针对新的客户端做了汉化文化&#xff0c;依…...

mysql union 和 union all区别?

在MySQL中&#xff0c;UNION和UNION ALL都是用于合并两个或多个SELECT语句的结果集。它们之间的主要区别在于如何处理重复记录。 UNION:UNION在合并结果集时会删除重复的记录。这意味着如果两个SELECT语句的输出结果中有相同的记录&#xff0c;那么UNION只会保留其中一个。在执…...

uni-app小程序 swiper 分页器样式修改

小程序中使用 wx-swiper-dot和wx-swiper-dot-active选择器 H5中使用uni-swiper-dot和uni-swiper-dot-active选择器 .swiper {height: 408px;margin-bottom: 28rpx;::v-deep .uni-swiper-dot {background: #e7e7e7;&.uni-swiper-dot-active {background: #b1b1b1;}}// #ifde…...

2023.11.23使用flask实现在指定路径生成文件夹操作

2023.11.23使用flask实现在指定路径生成文件夹操作 程序比较简单&#xff0c;实现功能&#xff1a; 1、前端输入文件夹 2、后端在指定路径生成文件夹 3、前端反馈文件夹生成状态 main.py from flask import Flask, request, render_template import osapp Flask(__name__)a…...

【Unity入门】Input.GetAxis(““)控制物体移动、旋转

使用Unity的Input.GetAxis(“”)控制物体移动、旋转 Input.GetAxis(“”) 是 Unity 引擎中的一个方法&#xff0c;用于获取游戏玩家在 键盘 或 游戏手柄 上输入的某个轴&#xff08;Axis&#xff09;的值。这里的 “” 是一个字符串参数&#xff0c;表示要获取的轴的名称。 在…...

【C++ 设计模式】面向对象设计原则 Template Method 模式 Strategy 策略模式

一、面向对象设计原则 重新认识面向对象 理解隔离变化 • 从宏观层面来看&#xff0c;面向对象的构建方式更能适应软件的变化&#xff0c; 能将变化所带来的影响减为最小 各司其职 • 从微观层面来看&#xff0c;面向对象的方式更强调各个类的“责任” • 由于需求变化导…...

Flink-简介与基础

Flink-简介与基础 一、Flink起源二、Flink数据处理模式1.批处理2.流处理3.Flink流批一体处理 三、Flink架构1.Flink集群2.Flink Program3.JobManager4.TaskManager 四、Flink应用程序五、Flink高级特性1.时间流&#xff08;Time&#xff09;和窗口&#xff08;Window&#xff0…...

mobiusp 正在创作乐曲

题目描述 mobiusp 创作了一首 n 个音符的乐曲&#xff0c;其中第 iii 个音符的音高为 ai​ &#xff0c;但是 mobiusp 对以前的创作风格和黑历史很不满意&#xff0c;他希望所有音符的音高 ai 都是 1∼7 的正整数&#xff0c;且相邻的音高差不超过 k 。 现在他要修改若干个音符…...

Jensen不等式

如果是正数&#xff0c;并且它们的和等于1&#xff0c;f是凸函数&#xff0c;那么&#xff1a; 也可表述为&#xff1a; 即x期望的凸函数值小于等于x凸函数值的期望...

北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(2)设计一个24秒倒计时器

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 counter_24.v 1.2 divid…...

什么是单元测试?

什么是单元测试 单元测试是软件开发中的一种测试方法&#xff0c;旨在验证各个软件组件或模块的功能正确性。在敏捷开发环境中&#xff0c;单元测试尤为重要&#xff0c;因为它有助于确保代码的质量和稳定性。下面是一些关于单元测试的关键点&#xff1a; 定义&#xff1a;单元…...

PTA-6-51(处理数组、字符串) 人口统计

题目&#xff1a; 本题运行时要求键盘输入10个人员的信息&#xff08;每一个人信息包括&#xff1a;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;民族&#xff09;&#xff0c;要求同学实现一个函数&#xff0c;统计民族是“汉族”的人数。 函数接口定义&#xff1a; pu…...

php中使用cdn

在 PHP 中使用 CDN 的一般流程如下&#xff1a; 1. 选择合适的 CDN 服务提供商&#xff1a;根据需求和预算选择合适的 CDN 服务提供商&#xff0c;例如阿里云CDN、腾讯云 CDN、Cloudflare 等。 2. 注册并配置 CDN 服务&#xff1a;在 CDN 服务提供商的网站上注册账号&#xf…...

docker部署MySQL5.7设置密码和远程访问的方法

运行MySQL docker run -p 3306:3306 --name mysql57 -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORDD7txumqc2b! -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...