单例还是可观察?错误的选择可能会让您失去晋升机会!
设计模式是创建结构良好且易于维护的软件的基础。其中Singleton和Observable常用于需要全局状态控制以及系统不同部分之间通信的场景。在本文中,我们将探讨这两个标准如何工作、何时使用它们、它们的差异,并提供如何实施它们的实际示例。
什么是单例?
单例模式是一种创建型设计模式,可确保一个类只有一个实例并提供对该实例的全局访问点。当您需要跨整个应用程序使用单个对象(例如全局设置、数据库连接或日志管理)时,此模式非常有用。
单例是如何工作的?
Singleton的主要特点是它将类实例限制为单个对象,确保所有实例请求返回相同的对象。为了实现这一点,该模式通常使用静态方法,仅在第一次请求时创建实例,保证整个系统中对象的唯一创建和使用。
在下图中,序列显示了如何创建和访问 Singleton 实例,以确保它是唯一的。
Singleton 序列图说明了客户端和 Singleton 类之间的交互流程。该过程从客户端调用静态 getInstance() 方法开始获取 Singleton 实例。如果尚未创建实例,Singleton 会创建一个新实例并返回它。当客户端再次调用 getInstance() 方法时,会返回同一个实例,确保整个程序执行过程中只有一个 Singleton 对象实例。
使用示例 - TypeScript 中的单例
class Singleton { private static instance: Singleton; private constructor() { } // Método para acessar a instância única public static getInstance(): Singleton { if (!Singleton.instance) { Singleton.instance = new Singleton(); } return Singleton.instance; } public showMessage(): string { return "Esta é a única instância!"; } } // Uso do Singleton const instance1 = Singleton.getInstance(); console.log(instance1.showMessage()); // "Esta é a única instância!" const instance2 = Singleton.getInstance(); console.log(instance1 === instance2); // true
何时使用单例?
- 全局设置:当您需要单个实例来存储系统设置,例如环境变量时。
- 连接管理:例如,管理与数据库或API服务器的连接。
- 资源管理:当需要控制对独特资源(例如记录器或缓存)的访问时。
什么是可观察的?
可观察模式是一种行为设计模式,定义对象之间的一对多依赖关系。换句话说,当一个对象(“主体”)的状态发生变化时,它的所有依赖者(“观察者”)都会自动得到通知。此模式广泛用于需要在不同组件之间传播事件和状态更改的系统,例如图形界面或监控系统。
可观察是如何工作的?
可观察模式允许对象“观察”对象状态的变化并对这些变化做出反应。该模式基于三个主要组件:
- Subject:维护状态并向观察者发送通知的对象。
- 观察者:对Subject的状态变化感兴趣的对象。
- 订阅:一种允许观察者订阅或取消订阅主题通知的机制。
Observable 序列图演示了该模式如何与多个观察者一起工作。当状态发生变化时,主体(或被观察对象)通知所有注册的观察者。每个观察者都会对通知做出反应,根据收到的信息采取必要的操作。通知过程被传播,以便所有观察者同时更新,使它们与主题的状态保持同步。当系统中有多个组件或部分需要了解对象状态的变化时,此模式非常有用。
用法示例 - TypeScript 中的 Observable
class Singleton { private static instance: Singleton; private constructor() { } // Método para acessar a instância única public static getInstance(): Singleton { if (!Singleton.instance) { Singleton.instance = new Singleton(); } return Singleton.instance; } public showMessage(): string { return "Esta é a única instância!"; } } // Uso do Singleton const instance1 = Singleton.getInstance(); console.log(instance1.showMessage()); // "Esta é a única instância!" const instance2 = Singleton.getInstance(); console.log(instance1 === instance2); // true
何时使用可观察的?
- 图形界面中的事件:对按钮点击、字段更改或屏幕更新做出反应。
- 状态更改通知:当需要向多个组件通知某个对象的更改时。
- 反应式数据流建模:在多个系统之间存在数据或事件传播的系统中,例如基于事件的应用程序。
Singleton 和 Observable 之间的区别
虽然这两种模式都以受控方式管理对象,但它们的目的和行为却非常不同:
Característica | Singleton | Observable |
---|---|---|
Objetivo | Garantir que uma classe tenha apenas uma instância. | Notificar múltiplos objetos sobre mudanças de estado. |
Instância | Apenas uma instância é criada e compartilhada. | Vários objetos podem ser observadores de um único sujeito. |
Uso principal | Gerenciamento de recursos exclusivos. | Notificação de eventos e mudanças de estado. |
Exemplo de uso | Gerenciamento de logs ou configuração global. | Atualização de interfaces gráficas ou propagação de eventos. |
可观察
目标
Singleton 和 Observable
模式在软件开发的多种情况下都是基础模式。当我们需要保证整个应用程序中的类的单个实例时,以上是单例还是可观察?错误的选择可能会让您失去晋升机会!的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...
