设计模式
面向对象设计原则
- 单一职责原则(SRP)
一个类应该仅有一个引起它变化的原因。
(职责划分明确,避免类承担过多功能导致高耦合) - 开闭原则(OCP)
软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
(通过抽象和多态实现功能扩展,而非直接修改原有代码) - 里氏替换原则(LSP)
所有引用基类的地方必须能透明地使用其子类的对象。
(子类必须能够完全替代父类,不破坏原有功能逻辑) - 依赖倒转原则(DIP)
高层模块不应该依赖低层模块,两者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。
(通过接口 / 抽象类解耦实现类,降低模块间直接依赖) - 接口隔离原则(ISP)
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
(细化接口设计,避免胖接口导致的强制实现冗余方法) - 合成复用原则(CRP)
尽量使用对象组合 / 聚合,而不是继承关系达到复用的目的。
(组合比继承更灵活,能避免继承带来的耦合问题和菱形继承等缺陷) - 迪米特法则(LoD)
一个对象应该对其他对象保持最少的了解(只与直接朋友通信)。
(降低类之间的耦合度,减少对外部系统的依赖)
创建型
工厂方法模式(Factory Method)
定义一个创建对象的接口,让子类决定实例化哪个类,将类的实例化延迟到子类。
(通过抽象工厂和具体工厂子类实现对象创建,解耦对象的使用和创建)抽象工厂模式(Abstract Factory)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
(通过抽象工厂和具体工厂族,创建多个产品族的对象,保持产品间的一致性)建造者模式(Builder)
将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
(通过导演类和具体建造者,分步构建复杂对象,简化构造逻辑)可以使用Lombok提供的@Builder注解快速实现。
单例模式(Singleton)
确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。
(通过静态实例和私有构造函数,控制实例数量,避免资源浪费)原型模式(Prototype)
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
(通过克隆方法快速创建对象,避免重复初始化过程,提升性能)
结构型
1.类/对象适配器模式
将一个类的接口转换成客户端期望的另一个接口,使原本接口不兼容的类可以一起工作。
2.桥接模式
将抽象部分与实现部分分离,使它们可以独立变化。
3.组合模式
将对象组合成树形结构以表示“整体-部分”层次结构,使客户端可以统一处理单个对象和对象组合。
4.装饰模式
动态地给对象添加额外的功能,而不改变其结构。
5.代理模式
为其他对象提供一个代理以控制对这个对象的访问。
6.外观模式
提供一个统一的接口,隐藏系统内部复杂性,使子系统更易使用。
7.享元模式
通过共享大量细粒度对象,减少内存使用以提升性能。
行为型
- 解释器模式:定义语言的文法并解释执行语句,如SQL解析。
- 模板方法模式:父类定义算法骨架,子类重写特定步骤,如冲泡咖啡/茶的流程。
- 责任链模式:多个对象依次处理请求,直到被处理或链结束,如审批流程。
- 命令模式:将请求封装为对象,支持参数化与队列操作,如遥控器指令。
- 迭代器模式:提供统一接口遍历集合元素,无需暴露内部结构,如集合的
iterator()
。 - 中介者模式:通过中介对象减少对象间直接耦合,如聊天室调度消息。
- 备忘录模式:捕获并外部化对象状态以便恢复,如游戏存档。
- 状态模式:对象行为随内部状态改变而改变,如订单状态流转。
- 策略模式:定义算法族并动态切换,如支付方式选择。
- 访问者模式:将操作与数据结构分离,便于新增操作,如文件类型的导出功能。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 dmw's blog!
评论