GoF(Gang of Four,四人组)是指 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四位软件工程专家,他们在1994年合著的《Design Patterns: Elements of Reusable Object-Oriented Software》一书中系统性地提出了23种经典面向对象设计模式,这些模式成为软件工程领域的重要基石。这些设计模式被划分为三大类:创建型模式、结构型模式和行为型模式,分别解决"如何创建对象"、"如何组织结构"以及"如何分配职责与通信"这三类核心问题。
以下是对其中几种经典 GoF 设计模式的简要介绍:
- 单例模式(Singleton Pattern) ------ 创建型模式
单例模式确保一个类在整个应用程序生命周期中仅存在一个实例,并提供一个全局访问点。其典型应用场景包括日志管理器、配置中心、数据库连接池等需要集中控制资源的场合。
实现要点包括:
私有构造函数:防止外部通过 new 创建实例;
静态私有实例字段:保存唯一实例;
静态公共方法(如 getInstance()):作为全局访问入口。
在 Java 中,推荐使用静态内部类或枚举方式实现线程安全且支持延迟加载的单例;而双重检查锁定(DCL)虽可行,但需配合 volatile 关键字以避免指令重排序问题。
- 工厂方法模式(Factory Method Pattern) ------ 创建型模式
工厂方法模式定义了一个用于创建对象的接口,但将具体实例化的责任延迟到子类。这种模式使得系统可以在不修改客户端代码的前提下引入新产品,符合开闭原则(OCP)。
例如,在一个消息发送系统中,可以定义 MessageSender 接口,并由 EmailSenderFactory 和 SmsSenderFactory 分别创建对应的实现类。客户端只需依赖抽象工厂接口,无需关心具体产品类型。
相较于简单工厂(通过 switch 判断类型),工厂方法模式更具扩展性,因为新增产品只需添加新的工厂子类,而无需改动现有代码。
- 观察者模式(Observer Pattern) ------ 行为型模式
观察者模式定义了对象间的一对多依赖关系,当一个对象状态发生改变时,所有依赖它的对象都会自动收到通知并更新。这是事件驱动系统(如 GUI 框架、消息订阅系统)的核心机制之一。
典型结构包括:
Subject(被观察者):维护观察者列表,提供注册/注销接口;
Observer(观察者):定义更新接口;
当 Subject 状态变化时,遍历 Observer 列表并调用其 update() 方法。
Java 中的 java.util.Observable 和 Observer 接口曾是标准实现(现已弃用),现代应用多采用自定义或响应式编程库(如 RxJava)来实现类似功能。
- 策略模式(Strategy Pattern) ------ 行为型模式
策略模式将一系列算法封装为独立的类,使它们可以互相替换,从而让算法的变化独立于使用它的客户端。该模式特别适用于需要在运行时动态切换行为的场景。
例如,一个电商系统可能支持多种折扣策略(满减、百分比折扣、会员专属等)。通过定义 DiscountStrategy 接口,并由 PercentageDiscount、FixedAmountDiscount 等类实现,订单计算逻辑只需持有策略引用,即可灵活切换折扣方式,而无需修改主流程。
策略模式的优点在于解耦算法与使用逻辑,提升代码可维护性和可测试性。
总结
GoF 提出的设计模式并非具体技术,而是一套经过实践验证的软件设计思想和最佳实践。它们通过抽象化常见问题的解决方案,帮助开发者构建高内聚、低耦合、可复用、易扩展的系统架构。单例、工厂、观察者、策略等模式分别从对象创建、结构组合、行为协作等维度提供了标准化的应对策略,至今仍在 Java、C#、Python、Go 等主流语言及框架(如 Spring、Laravel)中广泛应用。
掌握这些模式,不仅有助于理解现代框架的底层设计逻辑,更是迈向高级软件架构能力的关键一步。