• 【前端设计模式】之抽象工厂模式


    抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体类。在前端开发中,抽象工厂模式可以帮助我们更好地组织和管理代码,提高代码的可维护性和可扩展性。

    抽象工厂模式特性

    1. 抽象工厂模式将对象的创建与使用分离,客户端只需要关心接口而不需要关心具体实现。
    2. 抽象工厂模式可以通过切换具体工厂类来改变整个系统的行为。
    3. 抽象工厂模式符合开闭原则,当需要增加新的产品族时,只需要扩展抽象工厂和具体工厂类即可。

    应用示例

    1. 创建一个UI组件库:

     
    
    1. // 抽象工厂
    2. class UIComponentFactory {
    3. createButton() {}
    4. createInput() {}
    5. }
    6. // 具体工厂
    7. class MaterialUIComponentFactory extends UIComponentFactory {
    8. createButton() {
    9. return new MaterialButton();
    10. }
    11. createInput() {
    12. return new MaterialInput();
    13. }
    14. }
    15. class AntDesignUIComponentFactory extends UIComponentFactory {
    16. createButton() {
    17. return new AntDesignButton();
    18. }
    19. createInput() {
    20. return new AntDesignInput();
    21. }
    22. }
    23. // 抽象产品
    24. class Button {}
    25. class Input {}
    26. // 具体产品
    27. class MaterialButton extends Button {}
    28. class MaterialInput extends Input {}
    29. class AntDesignButton extends Button {}
    30. class AntDesignInput extends Input {}
    31. // 使用
    32. const materialFactory = new MaterialUIComponentFactory();
    33. const materialButton = materialFactory.createButton();
    34. const materialInput = materialFactory.createInput();
    35. const antDesignFactory = new AntDesignUIComponentFactory();
    36. const antDesignButton = antDesignFactory.createButton();
    37. const antDesignInput = antDesignFactory.createInput();

    1. UIComponentFactory 类是一个抽象的工厂类,它定义了两个基本的工厂方法:createButton() 和 createInput()。这些方法在具体的工厂类中被覆盖,以创建特定类型的按钮和输入框。
    2. MaterialUIComponentFactory 和 AntDesignUIComponentFactory 是两个具体的工厂类,它们继承自 UIComponentFactory。每个工厂都有自己的 createButton() 和 createInput() 方法,这些方法返回特定类型的按钮和输入框(分别是 MaterialButton 和 MaterialInput,以及 AntDesignButton 和 AntDesignInput)。
    3. Button 和 Input 是抽象产品类,它们定义了产品的一般性特征。具体的 MaterialButton 和 AntDesignButton 类继承自 Button 类,而 MaterialInput 和 AntDesignInput 类继承自 Input 类。

    最后创建了两个具体的工厂对象(materialFactory 和 antDesignFactory),并使用它们的 createButton() 和 createInput() 方法创建了具体的按钮和输入框对象。

    2. 创建一个跨浏览器的XHR对象

     
    
    1. // 抽象工厂
    2. class XHRFactory {
    3. createXHR() {
    4. return new XHR();
    5. }
    6. }
    7. // 具体工厂
    8. class StandardXHRFactory extends XHRFactory {
    9. createXHR() {
    10. return new StandardXHR();
    11. }
    12. }
    13. class ActiveXHRFactory extends XHRFactory {
    14. createXHR() {
    15. return new ActiveXHR();
    16. }
    17. }
    18. // 抽象产品
    19. class XHR {
    20. send(data) {
    21. throw new Error("This method must be overridden");
    22. }
    23. }
    24. // 具体产品
    25. class StandardXHR extends XHR {
    26. send(data) {
    27. console.log("Sending data with StandardXHR: " + data);
    28. }
    29. }
    30. class ActiveXHR extends XHR {
    31. send(data) {
    32. console.log("Sending data with ActiveXHR: " + data);
    33. }
    34. }
    35. // 使用
    36. let xhr;
    37. if (new XMLHttpRequest()) {
    38. const standardXhrFactory = new StandardXHRFactory();
    39. xhr = standardXhrFactory.createXHR();
    40. } else if (new ActiveXObject()) {
    41. const activeXhrFactory = new ActiveXHRFactory();
    42. xhr = activeXhrFactory.createXHR();
    43. } else {
    44. throw new Error("No suitable XHR implementation found");
    45. }
    46. if (xhr instanceof StandardXHR) {
    47. xhr.send("Some data");
    48. } else if (xhr instanceof ActiveXHR) {
    49. xhr.send("Some data");
    50. } else {
    51. throw new Error("Unknown XHR type");
    52. }

    首先,我们定义了一个抽象工厂类XHRFactory,其中包含一个createXHR()方法用于创建XHR对象。然后,我们定义了两个具体工厂类StandardXHRFactoryActiveXHRFactory,它们分别继承自抽象工厂类,并实现了createXHR()方法来创建具体的XHR对象。

    接着,我们定义了一个抽象产品类XHR,其中包含一个抽象方法send(data)。然后,我们定义了两个具体产品类StandardXHRActiveXHR,它们分别继承自抽象产品类,并实现了send(data)方法来发送数据。

    在使用部分,我们首先通过判断浏览器是否支持XMLHttpRequest来选择具体的工厂类。如果支持,则使用StandardXHRFactory创建一个标准的XHR对象;如果不支持,则使用ActiveXHRFactory创建一个ActiveX的XHR对象。然后,根据具体的XHR对象类型来调用相应的发送数据方法。

    这样,在不同浏览器环境下,我们可以通过抽象工厂模式来创建适合当前环境的跨浏览器的XHR对象,并且可以统一调用发送数据方法。

    优缺点

    优点
    1. 提供了一种封装对象创建的方式,使得客户端代码与具体类解耦,易于维护和扩展。
    2. 可以通过切换具体工厂类来改变整个系统的行为,提高代码的灵活性和可配置性。
    3. 符合开闭原则,当需要增加新的产品族时,只需要扩展抽象工厂和具体工厂类即可。
    缺点
    1. 增加了系统的复杂度,引入了更多的类和接口。
    2. 当产品族较多时,需要创建大量的具体工厂类,增加了代码量。

    总结

    抽象工厂模式是一种创建型设计模式,适用于需要创建一系列相关或相互依赖对象的场景。在前端开发中,抽象工厂模式可以帮助我们更好地组织和管理代码,提高代码的可维护性和可扩展性。它通过封装对象的创建过程,使得客户端代码与具体类解耦,并且可以通过切换具体工厂类来改变整个系统的行为。然而,它也增加了系统的复杂度,并且当产品族较多时会导致大量的具体工厂类。因此,在使用抽象工厂模式时需要权衡利弊,并根据实际情况进行选择。

  • 相关阅读:
    使用HandlerInterceptor 中注入其他service时为null分析及解决
    springboot球类运动教学网站的设计与实现271611
    【多目标追踪算法】Deepsort算法核心---卡尔曼滤波与匈牙利算法
    bootstrap练习
    CMAKE语法:target_compile_definitions、message、make -f、add_library
    mongodb一些常用的查询语句
    深入探讨进程间通信的重要性:理解不同的通信机制(上)
    QCefView入门及环境配置
    JSP详解
    HarmonyOS访问数据库实例(3)--用ORM Bee测下HarmonyOS到底有多牛
  • 原文地址:https://blog.csdn.net/wanghongpu9305/article/details/134012288