创建型模式
-
单例模式(Singleton Pattern)
- 目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- 用途:适用于需要对资源进行集中管理和控制访问的场景,如配置管理器、日志记录器等。
- 优化可读性:通过私有构造函数和静态实例,明确地表达了只有一个实例的意图,避免了重复创建对象的混乱。
-
工厂方法模式(Factory Method Pattern)
- 目的:定义一个创建产品对象的接口,但将具体实现延迟到子类。
- 用途:当创建对象的逻辑复杂或有多种产品变体时使用,如创建不同类型的数据库连接。
- 优化可读性:将对象创建逻辑封装在工厂类中,使客户端代码无需关心创建细节,代码更简洁。
-
抽象工厂模式(Abstract Factory Pattern)
- 目的:提供一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。
- 用途:适用于产品家族的创建场景,如创建不同风格的UI组件。
- 优化可读性:通过统一的工厂接口,让客户端代码可以一致地创建多个相关对象,减少条件判断。
-
建造者模式(Builder Pattern)
- 目的:将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。
- 用途:用于创建复杂对象,如构建一个包含多个属性的报表。
- 优化可读性:通过分步骤构建对象,使代码逻辑更清晰,易于理解和维护。
-
原型模式(Prototype Pattern)
- 目的:用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
- 用途:适用于对象创建成本较高或需要频繁创建相似对象的场景,如复制文档对象。
- 优化可读性:通过复制原型对象,避免了复杂的初始化和配置代码,使代码更简洁。
结构型模式
-
适配器模式(Adapter Pattern)
- 目的:将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而不能一起工作的类可以协同工作。
- 用途:用于系统集成或使用第三方库时,如将老接口适配到新系统中。
- 优化可读性:通过适配器类将不同接口进行转换,使代码的交互更加清晰,减少了直接修改原有代码的混乱。
-
桥接模式(Bridge Pattern)
- 目的:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 用途:适用于实现与抽象需要独立变化的场景,如图形编辑器中的形状和填充颜色。
- 优化可读性:将抽象与实现解耦,使代码更灵活,减少了类的继承层次,代码结构更清晰。
-
组合模式(Composite Pattern)
- 目的:将对象组合成树形结构以表示“部分-整体”的层次结构,使用户可以像处理单个对象一样处理对象组合。
- 用途:适用于文件系统、图形界面等具有层次结构的场景。
- 优化可读性:通过统一的接口处理单个对象和组合对象,使代码更具一致性,减少了重复代码。
-
装饰者模式(Decorator Pattern)
- 目的:动态地给对象添加一些额外的职责,而不改变原有对象的结构。
- 用途:适用于需要动态添加功能的场景,如装饰图形、添加网络滤波器等。
- 优化可读性:通过装饰类动态添加功能,避免了子类继承带来的复杂性,使代码更灵活易读。
-
外观模式(Facade Pattern)
- 目的:为子系统中的一组接口提供一个一致的界面,简化客户端对子系统的使用。
- 用途:适用于需要简化复杂子系统调用的场景,如客户端与多个服务器交互。
- 优化可读性:通过外观类封装复杂逻辑,提供简单的接口,使客户端代码更简洁,易于理解。
-
享元模式(Flyweight Pattern)
- 目的:运用共享技术有效地支持大量细粒度的对象。
- 用途:适用于内存占用较大的场景,如文本编辑器中的字符对象。
- 优化可读性:通过共享对象,减少了内存占用,代码中对象的创建和管理更清晰。
-
代理模式(Proxy Pattern)
- 目的:为其他对象提供一种代理以控制对这个对象的访问。
- 用途:适用于需要控制对象访问、延迟加载或分布式访问的场景。
- 优化可读性:通过代理类控制访问,使客户端代码无需关心对象的创建和访问细节,代码更简洁。
行为型模式
-
模板方法模式(Template Method Pattern)
- 目的:定义一个操作中的算法骨架,将一些步骤延迟到子类。
- 用途:适用于算法的整体步骤固定,但某些步骤需要子类实现的场景,如排序算法。
- 优化可读性:通过模板方法定义算法骨架,使子类只需关注特定步骤,代码结构更清晰。
-
命令模式(Command Pattern)
- 目的:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
- 用途:适用于需要记录操作历史、支持撤销/重做或异步执行的场景。
- 优化可读性:通过命令对象封装操作,使代码更具可读性和可维护性,客户端代码更简洁。
-
迭代器模式(Iterator Pattern)
- 目的:提供一种顺序访问聚合对象元素的方法,且不暴露其内部的表示。
- 用途:适用于需要遍历集合的场景,如遍历列表、树等数据结构。
- 优化可读性:通过迭代器封装遍历逻辑,使客户端代码更简洁,专注于业务逻辑。
-
观察者模式(Observer Pattern)
- 目的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
- 用途:适用于事件驱动的场景,如用户界面更新、股票价格通知等。
- 优化可读性:通过观察者和被观察者解耦,使代码更具可读性和可维护性,减少了直接调用的耦合。
-
中介者模式(Mediator Pattern)
- 目的:用一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用。
- 用途:适用于对象之间交互复杂的场景,如聊天室、控制面板等。
- 优化可读性:通过中介者封装交互逻辑,减少了对象之间的直接引用,代码结构更清晰。
-
状态模式(State Pattern)
- 目的:允许对象在内部状态改变时改变它的行为,看起来好像改变了它的类。
- 用途:适用于对象状态频繁变化的场景,如游戏中的角色状态、订单状态等。
- 优化可读性:通过状态对象封装不同状态的行为,使代码更清晰,状态转换更直观。
-
策略模式(Strategy Pattern)
- 目的:定义一系列算法,把它们封装成独立的类,并使它们可以互相替换。
- 用途:适用于算法需要动态切换的场景,如不同的排序算法、支付策略等。
- 优化可读性:通过策略类封装算法,使客户端代码可以灵活切换算法,代码更具可读性和可维护性。
-
责任链模式(Chain of Responsibility Pattern)
- 目的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
- 用途:适用于审批流程、拦截器链等场景。
- 优化可读性:通过责任链封装处理逻辑,客户端代码无需关心具体处理者,代码结构更清晰。
-
备忘录模式(Memento Pattern)
- 目的:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
- 用途:适用于需要保存和恢复对象状态的场景,如游戏存档、编辑器撤销操作等。
- 优化可读性:通过备忘录对象封装状态,使保存和恢复操作更清晰,代码更具可读性。
-
访问者模式(Visitor Pattern)
- 目的:表示一个作用于某对象结构中的各元素的操作,它可以在不改变各元素类的前提下定义作用于这些元素的新操作。
- 用途:适用于需要对对象结构中的元素进行多种不同的操作的场景,如代码分析工具。
- 优化可读性:通过访问者封装操作,使代码更具可读性和可维护性,客户端代码更简洁。
-
解释器模式(Interpreter Pattern)
- 目的:给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
- 用途:适用于需要解释特定语言或表达式的场景,如简单的算术表达式解释。
- 优化可读性:通过文法和解释器封装语言逻辑,使代码更具可读性和可维护性。
-
空对象模式(Null Object Pattern)
- 目的:提供一个空的实现对象,用于代替 null 值,以避免空指针异常。
- 用途:适用于需要处理空值的场景,如查询结果为空时。
- 优化可读性:通过空对象封装空值处理逻辑,使客户端代码无需进行空值检查,代码更简洁易读。