设计模式在 TypeScript 中的实现
设计模式在 TypeScript 中的实现欢迎继续本专栏的第三十八篇文章。在前几期中我们已逐步深化了对 TypeScript 性能优化的理解包括避免 any 类型的策略、类型推断的优化技巧以及在大型项目中的性能考虑。这些实践帮助我们构建了更高效和可维护的代码基础。今天我们将转向设计模式这一经典主题探讨如何在 TypeScript 中实现它们。设计模式是解决常见软件设计问题的可复用解决方案我们将通过示例实现单例、工厂和观察者模式并利用 TypeScript 的类型系统增强这些模式的可靠性和表达力。设计模式并非一成不变的规则而是指导原则在 TypeScript 中它们能与静态类型结合提供更强的编译时保证。我们将从设计模式的基础概念入手逐步深入到每个模式的实现细节并分析 TypeScript 类型系统如何提升模式的安全性和灵活性。通过由浅入深的讲解、丰富示例和实际场景分析我们旨在帮助您掌握这些模式的核心并在项目中应用它们构建更模块化和可扩展的软件架构。内容将从设计模式的基本原理展开到高级应用确保您能从简单实现过渡到类型增强的优化并获得深刻的实践洞见。理解设计模式在 TypeScript 中的定位设计模式是软件工程中经过验证的解决方案用于解决重复出现的特定问题。它们源于 GoFGang of Four的经典著作《设计模式》分为创建型、结构型和行为型三类。在 TypeScript 中设计模式定位于桥接面向对象原则与类型安全的结合TS 的静态类型系统能强化模式的约束确保实现符合意图同时减少运行时错误。例如单例模式保证唯一实例TS 类型能防止误用工厂模式抽象创建类型系统确保返回类型一致观察者模式处理事件接口定义订阅合同。设计模式的定位在于提升代码的可复用性、可维护性和扩展性。在动态的 JavaScript 环境中模式帮助管理复杂性TS 通过类型注解和接口让模式更 robust。例如利用泛型增强工厂的灵活性或用类型守卫确保观察者的参数安全。根据软件工程实践使用设计模式的 TS 项目代码重构成本可降低 15-25%尤其在大型应用如企业系统或前端框架中。相比纯 JavaScriptTS 的类型系统让模式从“约定”转为“强制”减少隐蔽 bug。为什么选择单例、工厂和观察者它们代表创建型工厂、单例和行为型观察者的典型能展示 TS 类型增强的多样性。我们将从每个模式的基础开始逐步引入 TS 优化确保您能理解模式如何从简单实现演变为类型安全的结构同时避免模式滥用导致的复杂性。设计模式在 TypeScript 中的应用历史与 OOP 语言同步但 TS 的类型特性让它们更现代化在框架如 Angular 或 NestJS 中广泛实现依赖注入和事件处理。这让模式成为架构设计的工具在实际开发中帮助管理状态和交互。设计模式的基础创建型、结构型和行为型的概述在深入具体模式前理解设计模式的分类有助于把握其作用。创建型模式关注对象创建如单例确保唯一、工厂抽象实例化结构型模式组织类和对象如适配器转换接口行为型模式定义通信如观察者处理通知。在 TypeScript 中基础模式实现类似于 JS但类型系统添加约束接口定义合同泛型提供灵活类型守卫确保安全。这让模式不只是结构还带有编译时验证。例如创建型模式用类型确保返回对象符合形状。基础概述为具体模式铺路我们将重点创建型单顿、工厂和行为型观察者因为它们常见且 TS 类型增强显著。单例模式确保唯一实例单例模式是一种创建型模式确保类只有一个实例并提供全局访问点。它适合管理共享资源如配置或数据库连接。单例模式的基础实现在 TypeScript 中基本单例用私有构造函数和静态方法classSingleton{privatestaticinstance:Singleton|nullnull;privateconstructor(){// 私有防止直接 new}publicstaticgetInstance():Singleton{if(!Singleton.instance){Singleton.instancenewSingleton();}returnSingleton.instance;}publicsomeMethod():void{console.log(Singleton method called);}}使用consts1Singleton.getInstance();consts2Singleton.getInstance();console.log(s1s2);// trues1.someMethod();基础静态 instance 存储唯一对象getInstance 控制访问。单例模式的深入实现与优化懒加载如上首次调用创建。线程安全在 JS 单线程中无需锁但 Node 多进程可用。初始化数据classConfigSingleton{privatestaticinstance:ConfigSingleton|nullnull;privateconfig:{[key:string]:string}{};privateconstructor(configData:{[key:string]:string}){this.configconfigData;}publicstaticgetInstance(configData?:{[key:string]:string}):ConfigSingleton{if(!ConfigSingleton.instance){if(!configData)thrownewError(Config data required for initialization);ConfigSingleton.instancenewConfigSingleton(configData);}returnConfigSingleton.instance;}publicget(key:string):string|undefined{returnthis.config[key];}}深入优化添加重置测试但生产慎用。单例深入让它适合全局状态但避免滥用导致耦合。利用 TypeScript 类型系统增强单例模式TS 类型增强单例私有构造确保类型安全静态方法返回精确类型。类型增强的基本应用上示例中getInstance 返回 Singleton 类型确保方法可用。防止误用私有构造编译时防 new Singleton()。类型增强的深入技巧泛型单例classGenericSingletonT{privatestaticinstances:Mapany,anynewMap();privateconstructor(privatedata:T){}publicstaticgetInstanceU(key:any,data:U):GenericSingletonU{if(!GenericSingleton.instances.has(key)){GenericSingleton.instances.set(key,newGenericSingleton(data));}returnGenericSingleton.instances.get(key);}publicgetData():T{returnthis.data;}}多键单例泛型 T 确保 data 类型。深入结合接口。interfaceILogger{log(message:string):void;}classLoggerSingletonimplementsILogger{// 单例实现log(message:string):void{console.log(message);}}constloggerLoggerSingleton.getInstance();logger.log(Message);// 类型 ILogger类型增强深入让单例安全TS 接口定义合同。工厂模式抽象对象创建工厂模式是创建型模式提供接口创建对象而不暴露逻辑。适合当创建复杂或有变体时。工厂模式的基础实现简单工厂classProductA{operation():string{returnProductA operation;}}classProductB{operation():string{returnProductB operation;}}classSimpleFactory{staticcreateProduct(type:string):ProductA|ProductB|null{if(typeA)returnnewProductA();if(typeB)returnnewProductB();returnnull;}}使用constprodSimpleFactory.createProduct(A);console.log(prod?.operation());基础工厂方法集中创建逻辑。工厂模式的深入实现抽象工厂接口定义工厂具体类实现。interfaceIProduct{operation():string;}classConcreteProduct1implementsIProduct{operation():string{returnConcreteProduct1;}}classConcreteProduct2implementsIProduct{operation():string{returnConcreteProduct2;}}interfaceIFactory{createProduct():IProduct;}classFactory1implementsIFactory{createProduct():IProduct{returnnewConcreteProduct1();}}classFactory2implementsIFactory{createProduct():IProduct{returnnewConcreteProduct2();}}functionclientCode(factory:IFactory){constproductfactory.createProduct();console.log(product.operation());}clientCode(newFactory1());// ConcreteProduct1深入抽象工厂支持家族产品易切换。工厂深入让创建解耦适合 DI。利用 TypeScript 类型系统增强工厂模式TS 类型增强工厂泛型确保返回类型接口定义合同。类型增强的基本应用泛型工厂classFactory{staticcreateT(ctor:new()T):T{returnnewctor();}}classMyClass{}constinstanceFactory.create(MyClass);// 类型 MyClass基本泛型 T 推断自 ctor。类型增强的深入技巧类型安全的抽象工厂interfaceIButton{render():void;}interfaceICheckbox{render():void;}interfaceIGUIFactory{createButton():IButton;createCheckbox():ICheckbox;}classWindowsButtonimplementsIButton{render():void{console.log(Windows Button);}}classWindowsCheckboximplementsICheckbox{render():void{console.log(Windows Checkbox);}}classWindowsFactoryimplementsIGUIFactory{createButton():IButton{returnnewWindowsButton();}createCheckbox():ICheckbox{returnnewWindowsCheckbox();}}classMacButtonimplementsIButton{render():void{console.log(Mac Button);}}classMacCheckboximplementsICheckbox{render():void{console.log(Mac Checkbox);}}classMacFactoryimplementsIGUIFactory{createButton():IButton{returnnewMacButton();}createCheckbox():ICheckbox{returnnewMacCheckbox();}}functionapplication(factory:IGUIFactory){constbuttonfactory.createButton();button.render();constcheckboxfactory.createCheckbox();checkbox.render();}application(newWindowsFactory());// Windows UIapplication(newMacFactory());// Mac UI接口 IGUIFactory 确保工厂返回正确类型类型系统检查实现。深入技巧泛型工厂参数化。typeConstructorTnew(...args:any[])T;functioncreateInstanceT(ctor:ConstructorT,...args:any[]):T{returnnewctor(...args);}classUser{constructor(publicname:string){}}constusercreateInstance(User,Alice);// 类型 User类型增强深入让工厂安全TS 泛型和接口防止错创建。观察者模式实现事件通知观察者模式是行为型模式定义一对多依赖当主体变化所有观察者通知。观察者模式的基础实现简单classSubject{privateobservers:(()void)[][];attach(observer:()void):void{this.observers.push(observer);}detach(observer:()void):void{this.observersthis.observers.filter(obsobs!observer);}notify():void{this.observers.forEach(obsobs());}}classObserver{update():void{console.log(Updated);}}constsubjectnewSubject();constobs1newObserver();constobs2newObserver();subject.attach(()obs1.update());subject.attach(()obs2.update());subject.notify();// Updated twice基础Subject 管理观察者notify 调用 update。观察者模式的深入实现发布订阅变体interfaceIObserver{update(data:any):void;}classPublisher{privatesubscribers:{[event:string]:IObserver[]}{};subscribe(event:string,observer:IObserver):void{if(!this.subscribers[event])this.subscribers[event][];this.subscribers[event].push(observer);}unsubscribe(event:string,observer:IObserver):void{this.subscribers[event]this.subscribers[event].filter(obsobs!observer);}publish(event:string,data:any):void{this.subscribers[event]?.forEach(obsobs.update(data));}}classSubscriberimplementsIObserver{update(data:any):void{console.log(Received:,data);}}constpublishernewPublisher();constsub1newSubscriber();publisher.subscribe(event1,sub1);publisher.publish(event1,data);// Received: data深入事件键分订阅支持多事件。观察者深入让模式适合 UI 事件或状态变化。利用 TypeScript 类型系统增强观察者模式TS 类型增强观察者接口定义 update 签名泛型指定 data 类型。类型增强的基本应用类型化 updateinterfaceIObserverT{update(data:T):void;}classSubjectT{privateobservers:IObserverT[][];attach(observer:IObserverT):void{this.observers.push(observer);}notify(data:T):void{this.observers.forEach(obsobs.update(data));}}classObserverimplementsIObserverstring{update(data:string):void{console.log(data);}}constsubjectnewSubjectstring();constobsnewObserver();subject.attach(obs);subject.notify(message);// OK// subject.notify(123); // 错误基本泛型 T 确保 data 类型一致。类型增强的深入技巧事件类型映射typeEvents{click:MouseEvent;keypress:KeyboardEvent;};classEventEmitter{privatelisteners:{[KinkeyofEvents]?:((event:Events[K])void)[]}{};onKinkeyofEvents(event:K,listener:(ev:Events[K])void):void{if(!this.listeners[event])this.listeners[event][];this.listeners[event]!.push(listener);}emitKinkeyofEvents(event:K,data:Events[K]):void{this.listeners[event]?.forEach(listenerlistener(data));}}constemitternewEventEmitter();emitter.on(click,evconsole.log(ev.clientX));// ev MouseEvent// emitter.on(click, ev ev.key); // 错误keyof mapped 类型确保事件数据匹配。深入技巧TS 类型让观察者类型安全防止错数据。实际应用设计模式在项目中的实践单例在配置管理。工厂在 DI 容器。观察者在 Redux 状态订阅。案例游戏引擎用单例资源管理工厂实体创建观察者事件系统。实践提升架构。高级设计模式与 TS 结合的扩展策略模式用类型守卫。代理模式用装饰器。高级扩展模式。风险与最佳实践风险模式滥用复杂。无类型模式运行错。继承过多 fragile。实践简单优先模式。类型化所有接口。测试模式行为。文档模式意图。确保有效。案例研究真实项目Angular 服务用工厂。RxJS 观察者。NestJS 单例模块。改善 25%。结语设计模式TS 架构的指南针通过本篇文章的详尽探讨您已掌握单例、工厂和观察者实现的细节以及 TS 类型增强。这些模式将助您设计优雅代码。实践实现单例。下一期 React 与 TS敬请期待。若疑问欢迎交流。我们继续。

相关新闻

性能优化:类型系统的最佳实践

性能优化:类型系统的最佳实践

性能优化:类型系统的最佳实践 欢迎继续本专栏的第三十七篇文章。在前几期中,我们已逐步深化了对 TypeScript 测试实践的理解,包括如何配置 Jest 以支持类型安全的断言和 mock,以及在异步代码中的错误处理策略。这些内容帮助我们构…

2026/7/3 18:37:04 阅读更多 →
山海鲸占用空间越来越大?软件瘦身攻略来了

山海鲸占用空间越来越大?软件瘦身攻略来了

一、概述 山海鲸可视化在使用过程中,我们可能会下载大量数据、组件和模型,最终导致山海鲸可视化占用存储空间越来越大。 下面就为大家详细介绍一下,应该如何减少山海鲸可视化对存储空间的占用。 二、项目清理 大量过往项目没有及时得到清理…

2026/7/3 18:37:06 阅读更多 →
零基础想转行网络安全?这3个方向门槛低、就业快

零基础想转行网络安全?这3个方向门槛低、就业快

【收藏】网络安全转行避坑指南:零基础无需报班,3个方向半年拿offer,薪资比IT高37% 网络安全人才缺口大,零基础转行无需报班。可考虑三个方向:运维工程师(网络防护,3个月就业,起薪1.2-1.5万)&am…

2026/7/4 20:16:56 阅读更多 →

最新新闻

远程协助软件推荐 远程协助软件哪个好

远程协助软件推荐 远程协助软件哪个好

日常帮亲友排查设备故障、异地处理工作难题,都需要靠谱的远程协助,便捷高效的远程协助能大幅降低跨设备、跨地域的操作成本。哪款远程协助软件体验比较呢?无界趣连2.0凭借轻量化设计与扎实的使用体验,成为个人日常远程协助的优选工…

2026/7/7 4:55:49 阅读更多 →
AD15 敷铜(Polygon Pour) 的完整操作,按步骤做即可,适合顶层/底层GND或电源敷铜。

AD15 敷铜(Polygon Pour) 的完整操作,按步骤做即可,适合顶层/底层GND或电源敷铜。

一、准备工作- 确保 板框(Board Shape) 已画好(机械层 Mechanical 1)。​- 布局、走线基本完成,DRC 先过一遍。​- 切换到要敷铜的层:底部层标签点 Top Layer(顶层) 或 Bottom Layer…

2026/7/7 4:55:49 阅读更多 →
NET 10:Oxigraph 的 FFI 桥接实践

NET 10:Oxigraph 的 FFI 桥接实践

架构概览┌──────────────────────────────────────────────────────────┐ │ .NET 应用层 │ │ ┌──────────┐ ┌────────────────…

2026/7/7 4:55:49 阅读更多 →
从静态限流到智能负载管理:Uber 如何治理大规模数据库过载

从静态限流到智能负载管理:Uber 如何治理大规模数据库过载

本文是对 How Uber Conquered Database Overload: The Journey from Static Rate-Limiting to Intelligent Load Management 的整理与翻译。 内容结构概览 本文会围绕 Uber 如何从静态限流走向智能负载管理展开,主要包括: 为什么 Uber 的数据库过载治理…

2026/7/7 4:47:48 阅读更多 →
Uber 如何用原生 gRPC 加速 OpenSearch:从 REST/JSON 瓶颈到搜索与写入性能优化

Uber 如何用原生 gRPC 加速 OpenSearch:从 REST/JSON 瓶颈到搜索与写入性能优化

本文是对 Accelerating Search and Inestion with High-Performance gRPC™ in OpenSearch™ 的整理与翻译。 内容结构概览 本文会围绕 Uber 如何在 OpenSearch 中引入原生 gRPC 传输层展开,主要包括: 为什么搜索系统在 Uber 几乎无处不在REST/JSON 在…

2026/7/7 4:47:48 阅读更多 →
CRM管理系统有哪些?2026年高性价比选型指南

CRM管理系统有哪些?2026年高性价比选型指南

很多企业在挑选 CRM 时,习惯先看每家的报价单,比完单价比折扣,最后选一个 "看起来最便宜" 的方案。但我们接触过的大量真实案例显示:约 60% 的企业在 CRM 上线后的第三年,实际支出会超出最初预算的 40% 以上…

2026/7/7 4:45:48 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻