单例模式确保类唯一实例,工厂模式 封装 对象 创建,观察者模式实现 事件 订阅,结合 SOLID 原则提升代码可维护性,通过模块化分层 架构 实现清晰职责划分,合理应用设计模式与架构原则可构建高效、可扩展的 前端 应用。

javaScript 设计模式与架构原则是构建可维护、可扩展 前端 应用的核心基础。掌握这些模式和原则,能帮助开发者写出更清晰、更易协作的代码。以下是一些关键的设计模式和架构原则,结合实际应用场景进行说明。
常见的 javascript 设计模式
设计模式是解决特定问题的成熟方案。在 JavaScript 中,由于语言的灵活性,很多模式可以以简洁的方式实现。
1. 单例模式(Singleton)
确保一个类只有一个实例,并提供全局访问点。适用于管理全局状态,比如配置对象或日志记录器。
立即学习“Java 免费学习笔记(深入)”;
const Logger = (function () {let instance; function init() {return { log: (msg) => console.log(`[LOG] ${msg}`) }; } return {getInstance: () => {if (!instance) instance = init(); return instance;} }; })();
使用时调用 Logger.getInstance() 总是返回同一个实例。
2. 工厂模式(Factory)
用于创建对象而不暴露创建逻辑。适合需要根据条件生成不同类型的对象场景。
例如,创建不同类型的用户界面组件:
function createButton(type) {switch (type) {case 'primary': return { render: () => '<button class="primary">Primary</button>' }; case 'secondary': return {render: () => '<button class="secondary">Secondary</button>' }; default: throw new Error('Unknown button type'); } }
调用 createButton(‘primary’) 返回对应按钮对象。
3. 观察者模式(Observer)
定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者自动更新。常用于事件系统或状态管理。
简单实现:
class EventHub {constructor() {this.events = {}; } on(event, handler) {if (!this.events[event]) this.events[event] = []; this.events[event].push(handler); } emit(event, data) {if (this.events[event]) {this.events[event].forEach(handler => handler(data)); } } }
核心架构原则:SOLID
SOLID 是五个 面向对象 设计原则的缩写,虽然源于 后端,但在现代 JavaScript 开发中同样适用。
单一职责原则(SRP)
一个模块或函数只做一件事。例如,一个 工具 函数只负责格式化日期,不同时处理 dom 操作。
拆分职责让代码更容易测试和复用。
开闭原则(OCP)
软件实体应对外扩展开放,对修改关闭。比如通过插件机制增加功能,而不是反复修改原有代码。
利用工厂或策略模式可以轻松实现这一原则。
里氏替换原则(LSP)
子类 应能替换其 父类 而不破坏程序行为。在 js 中虽无严格 继承 类型检查,但逻辑上应保持 接口 一致。
接口隔离原则(ISP)
客户端不应依赖它不需要的接口。避免创建“大而全”的对象,应按功能拆分接口。
依赖倒置原则(DIP)
高层模块不应依赖低层模块,二者都应依赖抽象。抽象不应依赖细节,细节应依赖抽象。
在 JavaScript 中可通过依赖注入实现:
function UserService(userApi) {this.userApi = userApi; // 依赖传入,而非内部创建 this.fetchUsers = () => this.userApi.get('/users'); }
便于替换 API 实现,利于单元测试。
模块化与分层架构
良好的项目结构是可维护性的保障。常见分层包括:
通过模块化(ES Modules)组织代码,每个文件职责明确,导出清晰接口。
例如:
// services/userService.js export const fetchUsers = async () => { const res = await fetch('/api/users'); return res.json();};
其他模块只需导入使用,无需关心实现细节。
实用建议
设计模式不是银弹,应在合适场景使用。过度设计反而增加复杂度。
- 优先考虑代码可读性和可测试性
- 模式服务于需求,而不是反过来
- 结合 typescript 可更好体现接口与类型约束
- 使用 ESLint 等工具强制 代码规范
基本上就这些。理解本质比死记硬背更重要。