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

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...