如果有遗漏,评论区告诉我进行补充
面试官: 什么是设计模式?你是否在你的代码里面使用哪些设计模式?
我回答:
设计模式是在软件设计中用来解决常见问题的一系列经过验证的解决方案。它不是完成任务的具体代码,而是一种描述在特定情况下,如何设计出优雅、可复用的解决方案的模板。设计模式通常包含了三个主要组成部分:模式名称、问题描述、以及解决方案。它们帮助开发者避免重复造轮子,提供了一种通用的语言来描述软件设计中常见的架构和问题。
设计模式的分类
设计模式通常被分为三大类:
-
创建型模式:关注对象的创建机制,确保系统在合适的时候创建合适的对象。
- 单例模式(Singleton)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
- 建造者模式(Builder)
- 原型模式(Prototype)
-
结构型模式:关注类或对象的组合,封装复杂的关联和交互。
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰器模式(Decorator)
- 外观模式(Facade)
- 享元模式(Flyweight)
- 代理模式(Proxy)
-
行为型模式:关注对象之间的责任分配。
- 责任链模式(Chain of Responsibility)
- 命令模式(Command)
- 解释器模式(Interpreter)
- 迭代器模式(Iterator)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 模板方法模式(Template Method)
- 访问者模式(Visitor)
在实际代码中使用设计模式的例子
在实际的Java项目中,设计模式的运用非常广泛,以下是一些具体的例子:
-
单例模式:它常用于管理全局状态或资源,创建需要全局唯一实例的类,比如配置管理、日志管理等。
- 实现方式:私有化构造函数,提供静态方法获取实例。
- 数据库连接池:确保系统中只有一个数据库连接池实例,所有数据库操作都通过这个实例进行,以提高性能和资源利用率。
- 配置管理类:用于读取和存储配置信息,确保整个应用使用统一的配置。
- 日志记录器:全局的日志记录器实例,用于记录应用中的关键信息和错误。
- 优点:
- 节约资源,避免重复创建对象。
- 提供全局访问点,方便使用。
- 缺点:
- 扩展困难,单例类职责过重,可能违背单一职责原则。
- 滥用单例可能导致资源争用或溢出。
-
工厂模式:用于创建对象,但不需要暴露创建逻辑,而是通过一个共同的接口来指向新创建的对象。如数据库连接、HTTP请求等,通过工厂方法封装创建逻辑,简化客户端代码。
- 实现方式:定义一个创建对象的接口,让子类决定实例化哪一个类。
- 创建复杂对象:如数据库连接、HTTP请求等,通过工厂方法封装创建逻辑,简化客户端代码。
- 解耦:系统需要与多种类型的对象交互时,可以使用工厂模式来解耦对象创建逻辑和客户端代码。
- 优点:
- 隐藏了对象创建的复杂性。
- 提高了系统的可扩展性和可维护性。
-
缺点:
- 当系统中产品类型较多时,工厂类会变得复杂。
-
装饰者模式:用于动态地给一个对象添加新的功能,而无需修改其结构。
- 实现方式:通过继承和组合,将新增的功能封装在装饰者类中。
-
观察者模式:用于定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
- 实现方式:定义一个主题类和观察者接口,主题类维护一个观察者列表,并在状态变化时通知它们。
- 事件驱动编程:如用户界面事件处理,当用户操作(如点击按钮)触发事件时,事件监听器(观察者)会收到通知并作出响应。
- 系统监控:监控系统中的关键指标(如CPU使用率、内存占用率),当这些指标发生变化时,通知相应的观察者(如报警系统、日志记录器)。
- 优点:
- 实现了观察者和主题之间的解耦。
- 支持广播通信,易于扩展。
-
缺点:
- 如果观察者过多,可能会导致性能问题。
- 如果观察者之间存在复杂的依赖关系,可能会导致更新顺序混乱。
-
策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。
- 实现方式:定义一个策略接口,然后根据具体策略实现该接口。
-
模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
- 实现方式:声明一个模板方法,定义一个算法的骨架,而将算法的一些步骤推迟到子类中实现。
设计模式的应用可以使代码更加清晰、易于维护和扩展,但过度设计或在不适当的情况下使用设计模式也会带来复杂性和不必要的开销。因此,理解和恰当地应用设计模式是非常重要的。