当前位置: 首页 > news >正文

设计模式之抽象工厂模式:最复杂的工厂模式变种

1. 介绍

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。

抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。

现实生活中,很少有单一的产品,很多都是各类产品组合,抽象工厂适合解决创建各种产品组合的问题,让代码扩展性更好,更方便维护,方便阅读代码。

1.1 优缺点及建议
  • 优点

    • 确保同一产品族的对象一起工作。

    • 客户端不需要知道每个对象的具体类,简化了代码。

  • 缺点

    • 扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。

2. 实现及相关代码

假设某业务需要创建多类产品,可能会有不同的组合。

2.1 没使用设计模式方式

2.1.1 接口及数据对象
    public interface ProductA {void execute();
    }public static class ProductA1 implements ProductA {public void execute() {System.out.println("产品A1的功能逻辑");}
    }public static class ProductA2 implements ProductA {public void execute() {System.out.println("产品A2的功能逻辑");}
    }public static class ProductA3 implements ProductA {public void execute() {System.out.println("产品A3的功能逻辑");}
    }public interface ProductB {void execute();
    }public static class ProductB1 implements ProductB {public void execute() {System.out.println("产品B1的功能逻辑");}
    }public static class ProductB2 implements ProductB {public void execute() {System.out.println("产品B2的功能逻辑");}
    }public static class ProductB3 implements ProductB {public void execute() {System.out.println("产品B3的功能逻辑");}
    }
    2.1.2 调用方法
      public static void main(String[] args) {// 我们现在要创建产品A1+产品B1的组合
      //		ProductA productA1 = new ProductA1();
      //		ProductB productB1 = new ProductB1();
      //		
      //		productA1.execute();
      //		productB1.execute();// 产品A1+产品B1 --变成--> 产品A1+产品B3的组合ProductA productA1 = new ProductA1();ProductB otherProductB3 = new ProductB3();productA1.execute();otherProductB3.execute();// 我们现在要创建产品A2+产品B2的组合ProductA productA2 = new ProductA2();ProductB productB2 = new ProductB2();productA2.execute();productB2.execute();// 我们现在要创建产品A3+产品B3的组合ProductA productA3 = new ProductA3();ProductB productB3 = new ProductB3();productA3.execute();productB3.execute();
      }
      2.1.3 可能会遇到的问题

      调整产品组合的这个行为,如果你手动创建产品组合的代码,假如有100个地方,A1+B1

      一旦要调整,就是要对100个地方的代码,手动一点一点的去修改,组合的逻辑

      这样的代码不可维护,不可扩展,而且阅读性极差

      2.2 使用设计模式方式

      使用抽象工厂模式,可以把创建对象组合的逻辑都封装到抽象工厂中,当更换产品组合时,只需要调整抽象工厂的产品组合创建即可,外部调用都不需要改变

      代码看起来会很整洁,并且条理清晰,方便阅读和更改。

      2.2.1 接口及数据对象
        public interface ProductA {void execute();
        }public static class ProductA1 implements ProductA {public void execute() {System.out.println("产品A1的功能逻辑");}
        }public static class ProductA2 implements ProductA {public void execute() {System.out.println("产品A2的功能逻辑");}
        }public static class ProductA3 implements ProductA {public void execute() {System.out.println("产品A3的功能逻辑");}
        }public interface ProductB {void execute();
        }public static class ProductB1 implements ProductB {public void execute() {System.out.println("产品B1的功能逻辑");}
        }public static class ProductB2 implements ProductB {public void execute() {System.out.println("产品B2的功能逻辑");}
        }public static class ProductB3 implements ProductB {public void execute() {System.out.println("产品B3的功能逻辑");}
        }public interface Factory {ProductA createProductA();ProductB createProductB();
        }public static class Factory1 implements Factory {private static final Factory1 instance = new Factory1();private Factory1() {}public static Factory get() {return instance;}public ProductA createProductA() {return new ProductA1();}public ProductB createProductB() {// 根据组合形式调整创建对象即可,修改一个地方,所以调用的地方组合一起改动
        //        return new ProductB1();return new ProductB3();}
        }public static class Factory2 implements Factory {private static final Factory2 instance = new Factory2();private Factory2() {}public static Factory get() {return instance;}public ProductA createProductA() {return new ProductA2();}public ProductB createProductB() {return new ProductB2();}
        }public static class Factory3 implements Factory {private static final Factory3 instance = new Factory3();private Factory3() {}public static Factory get() {return instance;}public ProductA createProductA() {return new ProductA3();}public ProductB createProductB() {return new ProductB3();}
        }
        2.2.2 调用方法
          public static void main(String[] args) {// 产品A1+产品B1 -> 产品A1+产品B3(只需要在对应工厂方法中,调整组合创建的对象即可)ProductA firstProductA = Factory1.get().createProductA();ProductB firstProductB = Factory1.get().createProductB();firstProductA.execute();firstProductB.execute();// 产品A2+产品B2ProductA secondProductA = Factory2.get().createProductA();ProductB secondProductB = Factory2.get().createProductB();secondProductA.execute();secondProductB.execute();// 产品A3+产品B3ProductA thirdProductA = Factory3.get().createProductA();ProductB thirdProductB = Factory3.get().createProductB();thirdProductA.execute();thirdProductB.execute();
          }

          http://www.dtcms.com/a/544988.html

          相关文章:

        • 设计模式>原型模式大白话讲解:就像复印机,拿个原件一复印,就得到一模一样的新东西
        • 网站数据库大小石家庄发布最新消息
        • 本地运行Tomcat项目
        • 大模型如何变身金融风控专家
        • 台州网站建设维护网页设计与制作教程杨选辉
        • 动力网站移动端模板网站建设价格
        • Windows 10终止服务支持:企业IT安全迎来重大考验
        • Mac os安装Easyconnect卡在正在验证软件包
        • 手机网站免费模板下载门户网站 销售
        • 学习和掌握RabbitMQ及其与springboot的整合实践(篇二)
        • Flink、Storm、Spark 区别
        • 当 AI Agent 遇上工作流编排:微软 Agent Framework 的 Workflow 深度解析
        • 5步构建多模式内容策略:统一品牌信息,最大化内容影响力
        • STP 转换为 3DXML 的技术指南及迪威模型网在线转换推荐
        • 如何建设视频网站好的网站设计题目
        • 深入理解 Vite 开发服务器的 Local 与 Network 地址
        • 免费建立网站的网站吗免费软件视频
        • 和利时 PLC 配网
        • 时间序列数据预测:14种机器学习与深度学习模型
        • 手机网站编程语言finecms
        • 第六部分:VTK进阶(第178章 网格质量评估vtkMeshQuality)
        • 多模态+CLIP | 视觉语言交互的终极形态?CLIP融合AIGC与持续学习,重塑多模态AI边界
        • Linux下CMake工具使用与Makefile生成完全指南
        • 关系型数据库、非关系型数据库、结构化数据、半结构化数据、非结构化数据、OLAP、OLTP的关系和区分
        • 成都市成华区建设局网站拐角型布局网站
        • java 文本内容 相似度比对
        • 切换jdk17
        • 定制型网站 成功案例网站建设费 税前扣除吗
        • 【SpringMVC】SpringMVC 请求与响应全解析:从 Cookie/Session 到状态码、Header 配置
        • 兰州网站建设ulezhi郑州网站建设培训短期班