单例模式确保类唯一实例并提供全局访问,观察者模式实现一对多响应式通信;二者可结合为单例事件总线,兼顾唯一性与松耦合通信。
单例模式确保一个类只有一个实例,并提供全局访问点;观察者模式定义对象间一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动收到通知。两者都用于解耦和复用,但解决的问题不同:单例关注“唯一性”,观察者关注“响应式通信”。
核心是控制构造逻辑,不让外部随意 new 实例。常见做法是用闭包或静态属性缓存实例,首次调用时创建,之后直接返回已有实例。
关键角色有“被观察者(Subject)”和“观察者(Observer)”。Subject 维护一个观察者列表,提供订阅(subscribe)、取消订阅(unsubscribe)、通知(notify)三个基本操作。
观察者对象加入列表可以。比如用单例实现一个全局事件总线(EventBus),它本身是唯一的,同时具备观察者功能:任何模块都能 subscribe 到它,也能 emit 事件通知其他模块。
不复杂但容易忽略细节:单例要防多线程(JS 单线程所以通常不用考虑),观察者要注意执行顺序和错误隔离。理解本质比死记代码更重要。