前端常用的7大设计模式-工厂模式

93 阅读4分钟

各位大佬好,我是一名三年经验的前端开发工程师,一转眼三年了,想当时刚入行的时候心比天高,当时定的目标好像三年了也没完成几个,最近一直在反思是不是该给自己一个规划逼自己一把了,于是乎今天就是我实行自己规划的起点。

常用的前端设计模式

创建型模式(5种)

一、创建设计模式

处理对象创建机制,优化对象的创建过程

1. 单例模式 (Singleton)
  • 定义:确保一个类仅有一个实例,并提供全局访问点。

  • 优点

    • 避免重复创建实例,节省资源。
    • 全局访问点方便共享数据(如 Redux Store)。
  • 缺点

    • 测试困难(全局状态污染)。
    • 违背单一职责原则(需自行管理实例生命周期)。
  • 应用场景:全局状态管理、浏览器中的 window 对象。

2. 工厂模式 (Factory)
  • 定义:通过工厂方法创建对象,而不暴露具体构造逻辑。

  • 类型

    • 简单工厂:根据条件返回不同对象。
    • 工厂方法:子类决定实例化哪个类。
  • 优点

    • 解耦对象创建与使用。
    • 易于扩展新类型(符合开闭原则)。
  • 缺点

    • 增加代码复杂度(需额外工厂类)。
  • 应用场景:UI组件库、动态创建DOM元素。

3. 原型模式 (Prototype)
  • 定义:通过克隆原型对象创建新对象(如 JavaScript 的原型继承)。

  • 优点

    • 避免重复初始化相似对象(性能优化)。
    • 简化对象创建过程。
  • 缺点

    • 深拷贝可能复杂(需处理引用类型属性)。
  • 应用场景:复制复杂配置对象、基于原型的继承(如 Object.create())。

二、结构型设计模式

关注对象之间的组合与关系,优化结构扩展性。

4. 代理模式 (Proxy)
  • 定义:通过代理对象控制对原对象的访问。

  • 优点

    • 隔离目标对象,增强安全性或延迟初始化(如懒加载)。
  • 缺点

    • 增加代码层级,可能影响性能。
  • 应用场景:图片懒加载、API请求拦截(如 Axios 拦截器)。

5. 装饰器模式 (Decorator)
  • 定义:动态地为对象添加职责,不改变其结构。

  • 优点

    • 灵活扩展功能(替代继承)。
    • 符合开闭原则(无需修改原代码)。
  • 缺点

    • 多层装饰可能增加复杂度。
  • 应用场景:高阶组件(React HOC)、日志装饰器。

三、行为型设计模式
6. 观察者模式 (Observer)
  • 定义:对象(Subject)维护一组依赖(Observers),状态变化时自动通知。

  • 优点

    • 解耦发布者与订阅者。
    • 支持一对多事件通信。
  • 缺点

    • 过度使用可能导致内存泄漏(未及时取消订阅)。
    • 通知顺序不可控。
    • 应用场景:事件监听(如 DOM 事件)。
7. 迭代器模式 (Iterator)
  • 定义:提供统一接口遍历集合元素,无需暴露内部结构。

  • 优点

    • 简化集合遍历逻辑。
    • 支持多种遍历方式(如正序、逆序)。
  • 缺点

    • 对简单集合可能过度设计。
  • 应用场景:遍历树结构、生成器函数(function*)。

简单的工厂模式

interface Animal {
    name:string
    speak:void
}

class Dog implements Animal {
      name:string
      constructor(name:string){
          this.name = name
     }
      speak(){
          console.log(this.name + '汪汪汪~')
     }
}
class Cat implements Animal {
     name:string
      constructor(name:string){
          this.name = name
     }
      speak(){
          console.log(this.name + '喵喵喵~')
     }
}

class AnimalFactory {
    static createAnimal(name:string , type:string){
       switch (type.toLowerCase()){
           case 'dog'
           return new Dog(name)
           break;
           case 'cat'
           retrurn new Cat(name)
           break;
           default: throw new Error(`未知的动物类型: ${type}`);
       }
    }
}

const dog = AnimalFactory.createAnimal("小狗","dog");
const cat = AnimalFactory.createAnimal("小猫","cat");

抽象的工厂模式

interface API {
    fetchData(): Promise<any>;
}
// 模拟用户api
 class UserAPI implements API {
     fetchData(): Promise<any> {
         return new Promise((resolve)=>{
             setTimeout(()=>{
                 resolve({ users: [{ id: 1, name: "John Doe" }] });
             },1000)
         })
     }
 }
 
  class ProductAPI implements API {
     fetchData(): Promise<any> {
         return new Promise((resolve)=>{
             setTimeout(()=>{
                 resolve({ products: [{ product_id: 1, name: "螺丝丁" }] });
             },1000)
         })
     }
 }
 
 // API 工厂类
 class  APIFactory {
    const apis = {
         poduct: new ProductAPI(),
         user: new UserAPI()
    }
    createAPI (type:string):API {
        return apis[type]
    }
 }
 
 function fetchDataFromAPI(apiType: string){
    const api = APIFactory.createAPI(apiType)
    api.fetchData().then((data)=>{
        console.log(data);
    })
 }
 
 fetchDataFromAPI('user')

总结

  1. 工厂模式 可以帮助我们解耦 API 的创建逻辑,使代码更具扩展性和可维护性。
  2. 通过动态注册的方式,可以轻松扩展新的 API 类型,而无需修改工厂类的核心逻辑。
  3. 这种模式非常适合需要根据配置或条件动态选择不同 API 的场景。