当前位置: 首页 > 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…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...