C++面试题之设计模式及设计原则

article/2025/8/28 11:29:18

六大设计原则

1)单一职责原则
类的职责单一,对外提供一个功能,函数也支持;
2)里氏替换原则
任何抽象类的出现都可以用他的实现类进行替换。
3)依赖倒置原则
依赖于抽象,不要依赖具体实现,也就是针对接口编程
4)接口隔离原则
一个接口对外应该只提供一种对外功能,不应该把所有操作都封装到一个接口里。
5)开闭原则
对扩展开放,对修改关闭;

//代码实现
class AbstractCaculator{
public:virtual int getResult() = 0;virtual void setOperatorNumber(int a,int b) = 0;
};
//加法计算器类
class PlusCaculator : public AbstractCaculator{
public:virtual void setOperatorNumber(int a,int b){this->mA = a;this->mB = b;
}
virtual int getResult(){return mA + mB;
}
public:int mA;int mB;
};
//减法计算器类
class MinuteCaculator : public AbstractCaculator{
public:virtual void setOperatorNumber(int a,int b){this->mA = a;this->mB = b;
}
virtual int getResult(){return mA - mB;
}
public:int mA;int mB;
};
//调用
void test(){AbstractCaculator* caculator1 = new PlusCaculator;caculator1->setOperatorNumber(10,20);caculator1->getResult();//30AbstractCaculator* caculator2 = new MinuteCaculator;caculator2->setOperatorNumber(30,20);caculator2->getResult();//10
}

6)迪米特原则(最少知识原则)
对象之间应该尽可能降低耦合度,可以通过提供一个
统一的接口来实现对象之间的交互

常见的设计模式

1)单例模式

单例模式,顾名思义,就是一个类只能有一个对象。
单例模式如何实现?
1)构造函数或者拷贝构造函数私有化
2)共有的静态变量和静态函数
单例模式分为懒汉模式饿汉模式。懒汉模式是在第一次用到类实例时才会实例化对象,而饿汉模式在定义时就创建了对象。其中,在多线程情况下,懒汉模式需要考虑安全问题,而饿汉模式不需要。
懒汉模式代码如下:

class Singleton
{
private:Singleton(); // 构造函数私有化Singleton(const Singleton& other); // 拷贝构造函数私有化
public:static Singleton* getInstance();// 静态成员函数static Singleton* m_instance;// 静态变量
};
Singleton* Singleton::m_instance = nullptr;
//线程非安全版本
Singleton* Singleton::getInstance()
{if(m_instance == nullptr){m_instance = new Singleton();}return m_instance;
}
//线程安全版本,加锁,但锁的成本太高(读操作是不必加锁的;高并发)
Singleton* Singleton::getInstance()
{Lock lock;if(m_instance == nullptr){m_instance = new Singleton();}return m_instance;
}
//双检查锁,但由于内存读写reorder不安全
Singleton* Singleton::getInstance()
{if(m_instance == nullptr){Lock lock;if(m_instance == nullptr){m_instance = new Singleton();}}return m_instance;
}

注意:先分配内存,再调用构造器,最后内存赋值给m_instance,reorder之后可能会发生先分配内存,再内存赋值给m_instance,最后调用构造器。

// C++ 11 版本之后的跨平台实现(volatile)
std::atomic<Singleton*> Singleton::m_instance;
std::mutex Singleton::m_mutex;Singleton* Singleton::getInstance()
{Singleton* temp = m_instance.load(std::memory_order_relaxed);std::atomic_thread_fence(std::memory_order_acquire);//获取内存fenceif(temp == nullptr){std::lock_guard<std::mutex> lock(m_mutex);if(temp == nullptr){temp = new Singleton;std::atomic_thread_fence(std::memory_order_relaxed);m_instance.store(temp, std::memory_order_relaxed);}}return temp;
}

线程安全的饿汉模式
在这里插入图片描述
2)策略模式策略模式适用于实现某一功能,而实现该功能的算法是经常改变的情况
在这里插入图片描述
在这里插入图片描述
当存在以下情况时使用Strategy模式
1)许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法;
2)需要使用一个算法的不同变体;
3)算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构;
4)一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以替代这些条件语句。

//代码实现
在这里插入图片描述
在这里插入图片描述
3)外观模式【肯德基套餐模式】
将复杂的子系统抽象到一个接口中管理,外界只需要通过该接口实现与子系统进行交互,而不必直接与子系统进行交互。
在这里插入图片描述

在这里插入图片描述
4)简单工厂模式
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
5)工厂模式
工厂模式=简单工厂模式+开闭原则
缺点:类的个数成倍增加,导致类越来越多,代码维护量加大。
6)抽象工厂模式
提供一个创建一系列相关或者互相依赖对象的接口,而无需指定具体的类;
主要解决接口选择的问题。
7)观察者模式
定义了一对多的关系,让多个观察者同时监听某一主题对象,当该主题对象发生变化时,将通知其他观察者对象。
观察者模式主要的角色,分别是:
抽象的观察者;具体的观察者;抽象的观察者目标;具体的观察者目标。
在这里插入图片描述
在这里插入图片描述

UML及设计文档内容模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/4khPNSgt.shtml

相关文章

23种设计模式(常见面试题)

23种设计模式&#xff08;常见面试题&#xff09; 1.什么是设计模式&#xff1f; 答&#xff1a; 设计模式&#xff08;Design Pattern&#xff09;是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。是一套用来提高代码可复用性、可维护性、可读性、稳健…

设计模式面试题(总结最全面的面试题!!!)

文章目录 设计模式什么是设计模式为什么要学习设计模式设计模式分类设计模式的六大原则开放封闭原则&#xff08;Open Close Principle&#xff09;里氏代换原则&#xff08;Liskov Substitution Principle&#xff09;依赖倒转原则&#xff08;Dependence Inversion Principle…

【2022最新Java面试宝典】—— 设计模式面试题(14道含答案)

目录 1.什么是设计模式2.为什么要学习设计模式3.设计模式分类4.设计模式的六大原则5.单例模式1.什么是单例2.那些地方用到了单例模式3.单例优缺点4.单例模式使用注意事项&#xff1a;5.单例防止反射漏洞攻击6.如何选择单例创建方式7.单例创建方式 6.工厂模式1.什么是工厂模式2.…

java高频面试题-设计模式

1 你所知道的设计模式有哪些&#xff1f; Java 中一般认为有 23 种设计模式&#xff0c;我们不需要所有的都会&#xff0c;但是其中常用的几种设计模式应该去掌握。下面列出了所有的设计模式。需要掌握的设计模式我单独列出来了&#xff0c;当然能掌握的越多越好。 总体来说设…

Java常见设计模式面试题及答案

文章目录 1.设计模式是什么&#xff1f;你是否在代码中使用过&#xff1f;2. JDK 中常用的设计模式有哪些&#xff1f;3.单例模式是什么&#xff1f;请用 Java 写出线程安全的单例模式4.在 Java 中&#xff0c;什么叫观察者模式&#xff08;observer design pattern&#xff09…

JAVA常见设计模式面试题

一、单例模式 java中单例模式是一种常见的设计模式&#xff0c;单例模式的写法有好几种&#xff0c;这里主要介绍三种&#xff1a;懒汉式单例、饿汉式单例、双重检查锁定 1.单例模式有以下特点&#xff1a;   a、单例类只能有一个实例。   b、单例类必须自己创建自己的唯一…

设计模式面试题

设计模式 详解 设计模式 参考&#xff1a; https://www.jianshu.com/p/fc4b2e679a1e 单例模式 整个应用中保证只有一个类的实例存在 参考&#xff1a; https://mp.weixin.qq.com/s/dlVXW6aW4wLcLpey9NxPig 饿汉式单例类 懒汉式单例类 instance new SingletonClas…

设计模式面试题(设计模式速成版)

文章目录 说明名词解释UML基础面向对象编程中&#xff0c;都有哪些设计原则开闭原则里氏替换原则&#xff08;Liskov Substitution Principle&#xff09;依赖转置&#xff08;依赖倒置&#xff09;原则单一职责原则接口隔离原则迪米特法则合成复用原则 设计模式的分类创建型模…

【前端面试题】06—16道设计模式面试题(附答案)

设计模式不是针对某个框架的&#xff0c;而是针对某类问题或某类需求提出的&#xff0c;因此有广泛的适用性。 我们学习设计模式不仅要学习理论&#xff0c;还要学习如何解决实际工作中的问题&#xff0c;所以在面试中&#xff0c;设计模式通常是结合某类需求考察的。 1、什么是…

❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!❤️

设计模式肝完了&#xff0c;还挺全&#xff01;腾讯和阿里的offer已拿&#xff01; 金九银十已经来了&#xff0c;挺近大厂最好的机会已经来了&#xff01;如果你是要找工作的&#xff0c;一定要抓住这个机会&#xff01; 前面已经整理了很多的面试资料&#xff1a; 1&#x…

「面试必背」设计模式面试题(收藏)

前言 设计模式在日常的工作中&#xff0c;是非常重要的一项技能&#xff0c;使用设计模式可以重构整体架构代码、提交代码复用性、扩展性、减少代码冗余问题。这是每个 Java 工程师必备的技能&#xff01;今日小编主要讲的是设计模式之一的策略模式&#xff0c;小编会通过案例…

textRank杂谈

转自&#xff1a;这些文章 1. PageRank算法概述 PageRank,即网页排名&#xff0c;又称网页级别、Google左侧排名或佩奇排名。 是Google创始人拉里佩奇和谢尔盖布林于1997年构建早期的搜索系统原型时提出的链接分析算法&#xff0c;自从Google在商业上获得空前的成功后&#xff…

人工智能自然语言处理—PageRank算法和TextRank算法详解

人工智能自然语言处理—PageRank算法和TextRank算法详解 一、PageRank算法 PageRank算法最初被用作互联网页面重要性的计算方法。它由佩奇和布林于1996年提出&#xff0c;并被用于谷歌搜索引擎的页面排名。事实上&#xff0c;PageRank可以在任何有向图上定义&#xff0c;然后…

TextRank算法学习及使用

文章目录 一、算法思想二、python代码实现三、TextRank算法使用1、textrank4zh模块的安装2、实例介绍 总结 参考资料&#xff1a; 文本关键词抽取、文本摘要生成是自然语言处理&#xff08;NLP&#xff09;的应用之一&#xff0c;一定会对我们的生活产生巨大影响。随着数字媒体…

自然语言处理NLP--TextRank算法

文本摘要方法 早在20世纪50年代&#xff0c;自动文本摘要已经吸引了人们的关注。在20世纪50年代后期&#xff0c;Hans Peter Luhn发表了一篇名为《The automatic creation of literature abstract》的研究论文&#xff0c;它利用词频和词组频率等特征从文本中提取重要句子&…

【自然语言处理】基于TextRank算法的文本摘要

基于TextRank算法的文本摘要 文本摘要是自然语言处理&#xff08;NLP&#xff09;的应用之一&#xff0c;一定会对我们的生活产生巨大影响。随着数字媒体的发展和出版业的不断增长&#xff0c;谁还会有时间完整地浏览整篇文章、文档、书籍来决定它们是否有用呢&#xff1f; 利…

【自然语言处理】利用TextRank算法提取关键词

利用TextRank提取关键词 TextRank 是一种基于 PageRank 的算法&#xff0c;常用于关键词提取和文本摘要。在本文中&#xff0c;我将通过一个关键字提取示例帮助您了解 TextRank 如何工作&#xff0c;并展示 Python 的实现。 使用 TextRank、NER 等进行关键词提取 1.PageRank简…

【NLP】关键词提取:TFIDF、TextRank

前两天看到论文《Chinese Poetry Generation with Planning based Neural Network》中使用TextRank进行关键词提取。在阅读文章时也想到了除了TextRank之外&#xff0c;经常还使用TFIDF进行关键词提取。 一些算法的使用取决于业务场景和算法的特性。关键词提取是干什么的呢&am…

TF-IDF算法和TextRank算法的分析比较

TF-IDF算法 TF-IDF&#xff08;词频-逆文档频率&#xff09;算法是一种统计方法&#xff0c;用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加&#xff0c;但同时会随着它在语料库中出现的频率成反比下降…

Python文本处理工具——TextRank

背景 TextRank是用与从文本中提取关键词的算法&#xff0c;它采用了PageRank算法&#xff0c;原始的论文在这里。Github地址。 这个工具使用POS( part-of-speech tagging : 词性标注 )然后抽取名词&#xff0c;这种方法对于关键词提取独具特色。 注意&#xff1a; 先安装NL…