2024年最新温故而知新篇一_团队分享模式(1),头条C C++面试算法

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

单例模式

是保证一个类只有一个实例,并且提供一个访问它的全局访问点。

在这里插入图片描述

  • 适用场景
  1. 需要频繁实例化然后销毁的对象
  2. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象
  3. 有状态的工具类对象
  4. 频繁访问数据库或文件的对象
  5. 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置等
  6. 控制资源的情况下,方便资源之间的互相通信。如线程池等
  • 优点
  1. 在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例
  2. 具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性
  3. 提供了对唯一实例的受控访问
  4. 由于在系统内存中只存在一个对象,因此可以 节约系统资源,当 需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能
  5. 允许可变数目的实例
  6. 避免对共享资源的多重占用
  • 缺点
  1. 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态
  2. 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难
  3. 单例类的职责过重,在一定程度上违背了“单一职责原则”
  4. 用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失

工厂模式

工厂模式是创建对象的常用设计模式,为了不暴露创建对象的具体逻辑,将逻辑封装在一个函数中,这个函数就称为一个工厂

本质上是一个负责生产对象实例的工厂(简单工厂,工厂方法和抽象工厂)

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

简单的模式

  • 适用场景
  1. 工厂类负责创建的对象比较少
  2. 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
  3. 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用
  • 优点
  1. 工厂类是整个模式的关键。包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象
  2. 过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的。明确了各自的职责和权利,有利于整个软件体系结构的优化
  • 缺点
  1. 由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中,它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了
  2. 当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求。这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利
  3. 这些缺点在工厂方法模式中得到了一定的克服

方法模式

  • 适用场景
  1. 工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度
  2. 需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式
  3. 工厂方法模式可以用在异构项目中,例如通过WebService与一个非Java的项目交互,虽然WebService号称是可以做到异构系统的同构化,但是在实际的开发中,还是会碰到很多问题,如类型问题、WSDL文件的支持问题,等等,从WSDL中产生的对象都认为是一个产品,然后由一个具体的工厂类进行管理,减少与外围系统的耦合
  4. 可以使用在测试驱动开发的框架下,例如,测试一个类A,就需要把与类A有关联关系的类B也同时产生出来,我们可以使用工厂方法模式把类B虚拟出来,避免类A与类B的耦合。目前由于JMock和EasyMock的诞生,该使用场景已经弱化了,读者可以在遇到此种情况时直接考虑使用JMock或EasyMock
  • 优点
  1. 良好的封装性,代码结构清晰,减少模块间的耦合
  2. 工厂方法模式的扩展性非常优秀
  3. 屏蔽产品类
  4. 工厂方法模式是典型的解耦框架
  • 缺点
  1. 使用者必须知道相应工厂的存在
  2. 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖

策略模式

策略模式的本意将算法的使用与算法的实现分离开来,避免多重判断调用哪些算法

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

  • 适用场景
  1. 多个类有不同的表现形式,每种表现形式可以独立成单独的算法
  2. 需要再不同情况下使用不同的算法,以后算法可能还会增加
  3. 对用户隐藏算法逻辑
  • 优点
  1. 每个算法单独封装,减少了算法和算法调用者的耦合
  2. 合理使用继承有助于提取出算法中的公共部分
  3. 简化了单元测试
  • 缺点
  1. 策略模式只适用于客户端知道所有的算法或行为的情况
  2. 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。不过可以使用享元模式来减少对象的数量

代理模式

代理模式是为其他对象提供一种代理,也就是当其他对象直接访问该对象时,如果开销较大,就可以通过这个代理层控制对该对象的访问。常见的使用场景为懒加载,合并http请求和缓存。

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

  • 适用场景
  1. 远程代理,为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实
  2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真是对象
  3. 安全代理,用来控制真实对象访问时的权限
  4. 智能指引,是指当调用真是的对象时,代理处理另外的一些事情
  • 优点
  1. 职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰
  2. 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用
  3. 高扩展性
  • 缺点
  1. 在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢
  2. 增加了系统的复杂度。

观察者模式

也叫发布订阅模式,在这种模式中,一个订阅者订阅发布者,当一个特定的事件发生的时候,发布者会通知(调用)所有的订阅者。

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

g-pU0TDW7z-1715672441815)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值