分享常用设计模式之单例模式(懒汉模式和饿汉模式)和几种关于设计模式的面试题
目录
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 ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 …...
黑马点评笔记 分布式锁
文章目录 分布式锁基本原理和实现方式对比Redis分布式锁的实现核心思路实现分布式锁版本一Redis分布式锁误删情况说明解决Redis分布式锁误删问题分布式锁的原子性问题分布式锁-Redission分布式锁-redission可重入锁原理分布式锁-redission锁重试和WatchDog机制分布式锁-redissi…...
java---抽象类 用abstract修饰
抽象类是不能被[ 直接 ] [ 显式 ]实例化的如果抽象类中有一个抽象方法,那么这个类一定要声明为抽象类(反过来说,如果一个类是抽象类,那么它里面可以没有抽象方法)如果父类中有一个抽象方法,那么抽象的子类,要么也得是抽象的,要么就把抽象的方法全部给具体化(实现了) 抽象方法 …...
JVM 之 javac、java、javap 命令详解
目录 一. 前言 二. javac 命令 三. java 命令 四. javap 命令 一. 前言 在日常工作中,我们新建 Java工程,写好代码后,编译和运行几乎都是通过 IDE(如idea、eclipse)工具完成。但作为 Java开发者还是要了解下 Java虚…...
市场被套牢,没有了解积累和分配,昂首资本一一介绍
很多投资者对市场中的积累和分配的概念不是很清楚,下面昂首资本将一一介绍。 积累意味着尽可能多地买入筹码,而不大幅抬高价格,直到在你买入时的价格水平上没有或几乎没有筹码。这种买入通常发生在市场熊市之后,此时有最佳买入价…...
notion 3.0.0 版本最新桌面端汉化教程,支持MAC和WIN版本
notion客户端汉化(目前版本3.0.0) 最近notion桌面端更新了3.0.0版本后会导致老版本汉化失效,本项目实现了最新版Notion桌面端的汉化。 文件下载地址:汉化文件下载地址 项目说明 本项目针对新的客户端做了汉化文化,依…...
mysql union 和 union all区别?
在MySQL中,UNION和UNION ALL都是用于合并两个或多个SELECT语句的结果集。它们之间的主要区别在于如何处理重复记录。 UNION:UNION在合并结果集时会删除重复的记录。这意味着如果两个SELECT语句的输出结果中有相同的记录,那么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实现在指定路径生成文件夹操作 程序比较简单,实现功能: 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 引擎中的一个方法,用于获取游戏玩家在 键盘 或 游戏手柄 上输入的某个轴(Axis)的值。这里的 “” 是一个字符串参数,表示要获取的轴的名称。 在…...
【C++ 设计模式】面向对象设计原则 Template Method 模式 Strategy 策略模式
一、面向对象设计原则 重新认识面向对象 理解隔离变化 • 从宏观层面来看,面向对象的构建方式更能适应软件的变化, 能将变化所带来的影响减为最小 各司其职 • 从微观层面来看,面向对象的方式更强调各个类的“责任” • 由于需求变化导…...
Flink-简介与基础
Flink-简介与基础 一、Flink起源二、Flink数据处理模式1.批处理2.流处理3.Flink流批一体处理 三、Flink架构1.Flink集群2.Flink Program3.JobManager4.TaskManager 四、Flink应用程序五、Flink高级特性1.时间流(Time)和窗口(Window࿰…...
mobiusp 正在创作乐曲
题目描述 mobiusp 创作了一首 n 个音符的乐曲,其中第 iii 个音符的音高为 ai ,但是 mobiusp 对以前的创作风格和黑历史很不满意,他希望所有音符的音高 ai 都是 1∼7 的正整数,且相邻的音高差不超过 k 。 现在他要修改若干个音符…...
Jensen不等式
如果是正数,并且它们的和等于1,f是凸函数,那么: 也可表述为: 即x期望的凸函数值小于等于x凸函数值的期望...
北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(2)设计一个24秒倒计时器
北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 counter_24.v 1.2 divid…...
什么是单元测试?
什么是单元测试 单元测试是软件开发中的一种测试方法,旨在验证各个软件组件或模块的功能正确性。在敏捷开发环境中,单元测试尤为重要,因为它有助于确保代码的质量和稳定性。下面是一些关于单元测试的关键点: 定义:单元…...
PTA-6-51(处理数组、字符串) 人口统计
题目: 本题运行时要求键盘输入10个人员的信息(每一个人信息包括:姓名,性别,年龄,民族),要求同学实现一个函数,统计民族是“汉族”的人数。 函数接口定义: pu…...
php中使用cdn
在 PHP 中使用 CDN 的一般流程如下: 1. 选择合适的 CDN 服务提供商:根据需求和预算选择合适的 CDN 服务提供商,例如阿里云CDN、腾讯云 CDN、Cloudflare 等。 2. 注册并配置 CDN 服务:在 CDN 服务提供商的网站上注册账号…...
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…...
别再傻傻分不清:5分钟搞懂通信里的误比特率、误码率、误帧率和误块率(BLER)
通信系统中的错误率指标全解析:从比特到数据块的精准诊断 想象一下你正在网购一件心仪已久的商品,快递过程中可能会发生各种意外:包裹里的某个小零件损坏(比特错误)、整个配件盒丢失(数据块错误)…...
XXL-Job适配PostgreSQL踩坑实录:版本差异、SQL改写与MyBatis Mapper的那些坑
XXL-Job适配PostgreSQL实战:从版本差异到SQL优化的完整指南 在分布式任务调度领域,XXL-Job凭借其轻量级设计和易用性赢得了众多开发者的青睐。然而当我们需要将其默认的MySQL存储切换到PostgreSQL时,会遇到一系列意料之外的挑战。本文将分享我…...
拿森智能获IPO备案:拟港交所上市
雷递网 乐天 4月19日拿森智能科技(浙江)股份有限公司日前获证监会IPO备案,拿到了上市的钥匙。拿森智能拟发行不超过109,058,400股境外上市普通股并在香港联合交易所上市。2026年4月17日,首创证券股份有限公司、深圳市星源材质科技…...
如何用ViGEmBus解决Windows游戏手柄兼容性难题:完整指南
如何用ViGEmBus解决Windows游戏手柄兼容性难题:完整指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 还在为Windows游戏手柄兼容性发愁吗&…...
GME-Qwen2-VL-2B-Instruct入门指南:图文匹配分数归一化算法与进度条映射逻辑
GME-Qwen2-VL-2B-Instruct入门指南:图文匹配分数归一化算法与进度条映射逻辑 1. 项目简介:一个解决图文匹配打分不准的本地工具 如果你用过一些多模态模型来做图文匹配,可能会遇到一个头疼的问题:模型给出的匹配分数很奇怪&…...
Percy HTML宏完全教程:在Rust中编写声明式UI组件
Percy HTML宏完全教程:在Rust中编写声明式UI组件 【免费下载链接】percy Build frontend browser apps with Rust WebAssembly. Supports server side rendering. 项目地址: https://gitcode.com/gh_mirrors/pe/percy Percy是一个基于Rust和WebAssembly的前…...
告别龟速下载!Hugging Face预训练模型(BERT/RoBERTa)手动下载与本地加载保姆级教程
突破网络限制:Hugging Face模型高效下载与本地化实战指南 1. 为什么我们需要离线加载Hugging Face模型? 国内开发者在尝试使用Hugging Face的预训练模型时,经常会遇到下载速度极慢甚至完全无法连接的问题。这种情况在高校网络环境或某些特定…...
FanControl:如何让Windows电脑风扇既安静又高效?一个开源解决方案的深度指南
FanControl:如何让Windows电脑风扇既安静又高效?一个开源解决方案的深度指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https:…...
AI Agent Harness Engineering 的部署架构:单体部署、分布式部署与混合云
AI Agent Harness Engineering 的部署架构:单体部署、分布式部署与混合云 1. 标题 (Title) 以下是精心设计的5个标题选项,覆盖技术硬核、实践场景、读者收益等核心维度: AI Agent Harness 深度部署指南:从单体原型到混合云生产级落地全链路 拥抱 Agent 革命:单体/分布式/…...
Product Hunt 每日热榜 | 2026-04-19
1. Claude Design by Anthropic Labs 标语:与Claude对话,制作原型、幻灯片和单页简介。 介绍:Claude Design是Anthropic推出的一款人工智能设计工具,它能够通过简单的提示将你的想法转化为精美的视觉作品。你可以用它创建原型、…...
