【前端设计模式】之享元模式

举报
俊刚 发表于 2024/02/18 17:15:18 2024/02/18
【摘要】 设计模式是在软件开发中经过验证的解决问题的方法。它们是从经验中总结出来的,可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和可重用性。无论是前端还是后端开发,设计模式都扮演着重要的角色。在本专栏中,我们将探索一些常见的前端设计模式,并学习如何将它们应用于实际项目中。通过掌握这些设计模式,我们可以编写更优雅、可靠且易于维护的前端代码。

✨ 专栏介绍

设计模式是在软件开发中经过验证的解决问题的方法。它们是从经验中总结出来的,可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和可重用性。无论是前端还是后端开发,设计模式都扮演着重要的角色。在本专栏中,我们将探索一些常见的前端设计模式,并学习如何将它们应用于实际项目中。通过掌握这些设计模式,我们可以编写更优雅、可靠且易于维护的前端代码。

image.png

本文主要讲解结构型模式中的享元模式


享元模式是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。在前端开发中,享元模式可以用于优化大量相似对象的创建和管理,从而提高页面的加载速度和用户体验。

享元模式特性

  1. 共享对象:享元模式通过共享相似对象来减少内存使用。相似对象可以共享一些不变的状态,而将可变的状态作为外部参数传入。
  2. 内部状态和外部状态:享元对象分为内部状态和外部状态。内部状态是不变的,可以被多个对象共享;外部状态是可变的,需要在运行时传入。
  3. 工厂管理:享元模式通常使用工厂来创建和管理共享对象。

应用示例

1. 图片懒加载

在一个页面中可能有多个图片需要加载,但是它们的显示区域可能重叠或者离用户可见区域较远。我们可以使用一个图片懒加载的工厂来创建图片对象,并将图片的URL作为外部参数传入。这样可以避免重复创建相同URL的图片对象,并且只有当图片进入用户可见区域时才进行加载。

// 图片懒加载工厂
const imageFactory = (function() {
  const imageCache = {};

  return {
    createImage: function(url) {
      if (imageCache[url]) {
        return imageCache[url];
      } else {
        const img = new Image();
        img.src = url;
        imageCache[url] = img;
        return img;
      }
    }
  };
})();

// 使用图片懒加载工厂创建图片对象
const img1 = imageFactory.createImage('image1.jpg');
const img2 = imageFactory.createImage('image2.jpg');
  1. 首先,通过自执行函数创建了一个封闭的工厂函数 imageFactory,这个函数返回一个对象,包含了 createImage 这个方法。
  2. 在这个工厂函数内部,创建了一个名为 imageCache 的对象,用于缓存已经创建过的图片对象。
  3. createImage 方法接收一个 URL 参数,然后根据这个 URL 创建一个新的图片对象。如果 imageCache 中已经存在该 URL 的图片对象,就直接返回缓存的版本,否则就创建一个新的图片对象并将其缓存。
  4. 最后,通过调用 imageFactory.createImage 方法,分别创建了两个图片对象 img1img2

通过这种方式,当多次请求同一个 URL 的图片时,可以直接从缓存中获取,避免了重复的 HTTP 请求,提高了性能。同时,由于图片对象是缓存在内存中的,即使页面跳转或刷新,这些图片对象也不会被销毁,可以继续用于之后的渲染过程。

2. 表单验证

在一个表单中可能有多个输入框,每个输入框都需要进行验证。我们可以使用一个验证器的工厂来创建验证器对象,并将验证规则作为外部参数传入。这样可以避免重复创建相同规则的验证器对象。

// 表单验证器工厂
const validatorFactory = (function() {
  const validatorCache = {};

  return {
    createValidator: function(rule) {
      if (validatorCache[rule]) {
        return validatorCache[rule];
      } else {
        const validator = {
          validate: function(value) {
            // 根据规则进行验证
          }
        };
        validatorCache[rule] = validator;
        return validator;
      }
    }
  };
})();

// 使用表单验证器工厂创建验证器对象
const emailValidator = validatorFactory.createValidator('email');
const phoneValidator = validatorFactory.createValidator('phone');
  1. 首先,通过自执行函数创建了一个封闭的工厂函数 validatorFactory,这个函数返回一个对象,包含了 createValidator 这个方法。
  2. 在这个工厂函数内部,创建了一个名为 validatorCache 的对象,用于缓存已经创建过的验证器对象。
  3. createValidator 方法接收一个规则参数,然后根据这个规则创建一个新的验证器对象。如果 validatorCache 中已经存在该规则的验证器对象,就直接返回缓存的版本,否则就创建一个新的验证器对象并将其缓存。
  4. 在创建验证器对象时,定义了一个 validate 方法用于进行具体的验证操作。具体的验证逻辑需要根据具体的规则来实现。
  5. 最后,通过调用 validatorFactory.createValidator 方法,分别创建了两个验证器对象 emailValidatorphoneValidator

通过这种方式,当需要使用相同的规则进行验证时,可以直接从缓存中获取验证器对象,避免了重复的创建过程,提高了性能。

优缺点

优点

  1. 减少内存使用:享元模式通过共享相似对象来减少内存使用,特别适用于大量相似对象的场景。
  2. 提高性能:由于减少了对象的创建和销毁,享元模式可以提高系统的性能和响应速度。
  3. 简化代码逻辑:享元模式将对象的内部状态和外部状态分离,使得代码更加清晰和易于维护。

缺点

  1. 增加复杂性:享元模式引入了共享对象和工厂管理,增加了系统的复杂性。
  2. 共享状态的安全性:如果多个对象共享了相同的内部状态,那么一个对象对内部状态的修改可能会影响其他对象。

总结

享元模式是一种优化大量相似对象创建和管理的设计模式,在前端开发中可以用于优化图片懒加载、表单验证等场景。它通过共享相似对象来减少内存使用和提高性能,同时也简化了代码逻辑。然而,它也增加了系统的复杂性,并且需要注意共享状态的安全性。在实际应用中,我们需要根据具体场景权衡使用享元模式带来的优缺点。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。