面试官:谈谈你知道的设计模式❓

创建型模式🔧

1)单例模式(Singleton)🚩
确保一个类只有一个实例,并提供一个全局访问点。

2)工厂方法模式(Factory Method)🚩
定义一个创建对象的接口,让子类决定实例化哪一个类。
使用场景🚀:当一个类不能预见要创建哪种类的实例时,或者一个类希望由其子类来指定创建的对象时,例如,开发工具中的插件管理器。

3)抽象工厂模式(Abstract Factory)🚩
创建相关或依赖对象的家族,而不需要明确指定具体类。
使用场景🚀:当需要创建一系列相关或相互依赖的对象时,同时又希望隐藏这些对象的具体类时,例如,跨平台的 UI 组件库。

4)建造者模式(Builder)🚩
使用多个简单的对象一步一步构建成一个复杂的对象。
使用场景🚀:当构建一个对象需要很多步骤,这些步骤需要顺序执行,或者构建过程需要多种表示时,例如,组装一台个性化PC。

5)原型模式(Prototype)🚩
通过复制现有的实例来创建新的实例,而不是通过新建类。
使用场景🚀:当创建一个对象比克隆它更昂贵时,或者系统需要独立于其产品创建、组合和表示的方式时,例如,用于恢复历史状态的撤销操作。

结构型模式⛏

1)适配器模式(Adapter)🚩
允许将一个类的接口转换成客户希望的另一个接口。
使用场景🚀:当希望将一个类的接口转换成客户期望的另一个接口,使不兼容的类能一起工作时,例如,集成第三方库或API。

2)桥接模式(Bridge)🚩
将抽象部分与实现部分分离,使它们可以独立变化。
使用场景🚀:当希望将抽象部分与其实现部分分离,使它们可以独立变化时,例如,UI框架中,将抽象的窗口与具体的窗口实现分离。

3)装饰器模式(Decorator)🚩
动态地给一个对象添加一些额外的职责。
使用场景🚀:当需要为对象动态地添加功能,而不改变其结构时,例如,为流添加新的读写功能。

4)组合模式(Composite)🚩
将对象组合成树形结构以表示“部分-整体”的层次结构。
使用场景🚀:当需要表示对象的部分-整体层次结构,并希望用户忽略组合对象与单个对象的不同,统一地使用组合结构时,例如,图形编辑器中的图形和图形组。

5)外观模式(Facade)🚩
提供一个统一的接口,用来访问子系统中的一群接口。
使用场景🚀:当需要为复杂的子系统提供一个简单的接口时,例如,简化数据库操作的库。

6)享元模式(Flyweight)🚩
通过共享来减少对象的创建,达到减少内存占用的目的。
使用场景🚀:当需要大量的相似对象,且存储成本高昂时,通过共享来减少资源消耗,例如,文字处理软件中的字符对象(Integer 使用了享元模式这个缓存是 -128到 127(包含-128和127)之间的整数)

7)代理模式(Proxy)🚩
为其他对象提供一种代理以控制对这个对象的访问。
使用场景🚀:当需要为另一个对象提供代理或占位符以控制对这个对象的访问时,例如,远程对象访问、延迟初始化、访问控制。

行为型模式🌈

1)责任链模式(Chain of Responsibility)🚩
将请求的发送者和接收者解耦,让多个对象都有机会处理这个请求。
使用场景🚀:当有多个对象可以处理一个请求,而发送者不知道应该由哪个对象处理时,例如,处理审批流程

2)命令模式(Command)🚩
将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化。
使用场景🚀:当需要将请求封装为对象,以使用不同的请求、队列或日志请求来参数化其他对象时,例如,实现撤销功能。

3)解释器模式(Interpreter)🚩
给定一个语言,定义它的文法的一种表示,并定义一个解释器。
使用场景🚀:当有一个语言需要解释执行,并且可以将语言中的句子表示为一个抽象语法树时,例如,SQL解析、正则表达式。

4)迭代器模式(Iterator)🚩
提供一种方法顺序访问一个聚合对象中各个元素,而又无需暴露该对象的内部表示。
使用场景🚀:当需要提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示时,例如,遍历集合。

5)中介者模式(Mediator)🚩
用一个中介对象来封装一系列的对象交互。
使用场景🚀:当一组对象以定义良好但复杂的方式进行通信,产生了相互依赖的网状结构时,例如,实现MVC框架。

6)备忘录模式(Memento)🚩
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
使用场景🚀:当需要恢复对象到之前的状态(撤销通过rollback实现)而不暴露其内部细节时,例如,编辑器的撤销操作。

7)观察者模式(Observer)🚩
对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知并自动更新。
使用场景🚀:当一个对象状态的改变需要通知其他对象,而又希望这些对象之间是松散耦合的时,例如,实现事件订阅系统。

8)状态模式(State)🚩
允许一个对象在其内部状态改变时改变它的行为。
使用场景🚀:当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变其行为时,例如,线程状态管理。

9)策略模式(Strategy)🚩
定义一系列的算法,把它们一个个封装起来,并使它们可相互替换。
使用场景🚀:当有多种算法相似,客户端希望动态地选择使用哪一种算法时,例如,不同类型的排序算法。

10)模板方法模式(Template Method)🚩
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现。
使用场景🚀:当多个子类有共有的方法,并且逻辑基本相同时,把这些逻辑算法放在单一的模板方法中,子类通过实现抽象方法来提供详细的实现,例如,算法的框架。

11)访问者模式(Visitor)🚩
在不改变元素的类的前提下,定义作用于这些元素的新操作。
使用场景🚀:当作用于某对象结构中的各元素的操作需要改变,而对象结构不变时,例如,在不改变集合元素的类的情况下增加新的操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值