首页 > 其他分享 >为什么要用工厂模式

为什么要用工厂模式

时间:2024-10-17 10:48:29浏览次数:8  
标签:为什么 代码 模式 工厂 具体 产品 public 客户端

1.复合开闭原则,对扩展开放,对修改关闭。客户端比如feign调用时,当服务端修改代码后,客户端不需要修改代码。

Java中的工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。以下是对Java工厂方法模式的详细解析:

一、定义与特点

工厂方法模式定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。其主要特点包括:

  1. 抽象工厂角色:声明了工厂方法,用于返回一个产品对象。
  2. 具体工厂角色:实现了抽象工厂角色中的工厂方法,用于返回一个具体的产品对象。
  3. 抽象产品角色:定义了产品的接口,是工厂方法所创建对象的超类型,也就是产品对象的共同接口。
  4. 具体产品角色:实现了抽象产品角色所定义的接口,由具体工厂角色创建,客户端通过抽象产品角色使用具体产品。

二、结构与实现

工厂方法模式的典型结构包含以下四个主要部分:

  1. 抽象产品类:定义产品的接口,是工厂方法所创建的对象的超类型,即产品对象的共同接口。
  2. 具体产品类:实现了抽象产品类所定义的接口,由具体工厂类创建,客户端通过抽象产品类使用具体产品。
  3. 抽象工厂类:声明了工厂方法,用于返回一个产品对象。它是一个抽象类,通常由Java接口或抽象类实现。
  4. 具体工厂类:实现了抽象工厂类中的工厂方法,用于创建一个具体的产品对象。

在实现时,客户端代码通过抽象工厂类和抽象产品类与具体实现进行解耦,从而可以在不修改客户端代码的情况下更换具体工厂类或具体产品类。

三、优点

  1. 降低耦合度:通过将对象的创建过程集中到一个工厂类中,降低了客户端与具体产品之间的耦合度,使得系统更加灵活和易于维护。
  2. 提高复用性:工厂方法模式通过工厂方法、抽象工厂等方式来创建对象,提高了代码的复用性和可读性。它避免了重复的代码实现,因为对象的创建逻辑被封装在工厂类中,可以在多个地方重用该工厂类的实例或方法。
  3. 符合开闭原则:工厂方法模式支持在不修改已有代码的前提下扩展系统,通过添加新的具体工厂类和具体产品类来实现新的功能。
  4. 隐藏创建细节:工厂方法模式将对象的创建过程封装在工厂类中,对客户端隐藏了对象的创建细节,增强了系统的安全性。

四、缺点

  1. 增加系统复杂性:每增加一个产品,都需要增加一个具体产品类和一个具体工厂类,增加了系统的复杂性。当产品种类较多时,会导致类的数量激增。
  2. 产品族扩展困难:在工厂方法模式中,如果需要增加新的产品族(即一组相关联的产品),需要修改所有的具体工厂类,这在一定程度上影响了系统的扩展性。

五、适用场景

  1. 当一个类不知道它所必须创建的对象的类时。
  2. 当一个类希望由它的子类来指定它所创建的对象时。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时。

六、示例代码

以下是一个简单的工厂方法模式示例代码:

java复制代码
  // 抽象产品角色
  public interface Product {
  void doSomething();
  }
   
  // 具体产品A
  public class ProductA implements Product {
  @Override
  public void doSomething() {
  System.out.println("A do Something");
  }
  }
   
  // 具体产品B
  public class ProductB implements Product {
  @Override
  public void doSomething() {
  System.out.println("B do Something");
  }
  }
   
  // 抽象工厂角色
  public abstract class Factory {
  abstract Product create();
  }
   
  // 具体工厂A
  public class FactoryA extends Factory {
  @Override
  Product create() {
  return new ProductA();
  }
  }
   
  // 具体工厂B
  public class FactoryB extends Factory {
  @Override
  Product create() {
  return new ProductB();
  }
  }
   
  // 客户端代码
  public class Client {
  public static void main(String[] args) {
  Factory factory = new FactoryA();
  Product product = factory.create();
  product.doSomething();
   
  factory = new FactoryB();
  product = factory.create();
  product.doSomething();
  }
  }

在这个示例中,Product是抽象产品角色,ProductAProductB是具体产品角色,Factory是抽象工厂角色,FactoryAFactoryB是具体工厂角色。客户端代码通过调用具体工厂类的create方法来创建具体的产品对象,并调用产品的doSomething方法。

综上所述,Java工厂方法模式是一种强大的设计工具,可以帮助开发者构建更加灵活、可扩展和易于维护的软件系统。通过合理地使用工厂方法模式,可以提高代码的质量、可维护性和可复用性。

如果不使用工厂方法模式创建对象,而是手动创建,代码的结构会相对简单,但可能会失去工厂方法模式带来的灵活性和可扩展性。以下是一个不使用工厂方法模式,而是直接手动创建对象的示例代码:

java复制代码
  // 产品接口或抽象类
  public interface Product {
  void doSomething();
  }
   
  // 具体产品A
  public class ProductA implements Product {
  @Override
  public void doSomething() {
  System.out.println("ProductA is doing something.");
  }
  }
   
  // 具体产品B
  public class ProductB implements Product {
  @Override
  public void doSomething() {
  System.out.println("ProductB is doing something.");
  }
  }
   
  // 客户端代码
  public class Client {
  public static void main(String[] args) {
  // 手动创建ProductA对象
  Product productA = new ProductA();
  productA.doSomething();
   
  // 手动创建ProductB对象
  Product productB = new ProductB();
  productB.doSomething();
   
  // 如果需要更多的产品类型,继续手动创建
  // ...
  }
  }

在这个示例中,Product接口定义了一个产品应该具有的行为,ProductAProductB是实现了该接口的具体产品。客户端代码Client中直接使用了new关键字来创建ProductAProductB的实例,并调用了它们的方法。

与工厂方法模式相比,这种手动创建对象的方式有以下几个缺点:

  1. 代码耦合度高:客户端代码直接依赖于具体的产品类,如果产品类发生变化(比如类名、包名或构造方法),客户端代码也需要相应地进行修改。

  2. 扩展性差:如果系统中需要添加新的产品类型,客户端代码需要修改以包含新的产品创建逻辑,这违反了开闭原则(对扩展开放,对修改关闭)。

  3. 缺乏灵活性:客户端代码在编译时就确定了要创建的对象类型,无法在运行时动态地选择创建哪种类型的产品。

因此,虽然手动创建对象的方式在代码上看起来更简单,但在大型系统中,使用工厂方法模式或其他创建型设计模式通常能够带来更好的代码结构、更高的灵活性和可扩展性。

标签:为什么,代码,模式,工厂,具体,产品,public,客户端
From: https://www.cnblogs.com/zqlmianshi/p/18471584

相关文章

  • 为什么同一个Camera有两个RenderSingleCamera的耗时
    1)为什么同一个Camera有两个RenderSingleCamera的耗时2)Unity2022中SBP打包报错问题排查3)Application.lowMemory在什么时候会生效4)一般iOS机型要超过其运行内存的多少会容易崩溃这是第404篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力......
  • IIC通信配置时,其GPIO应处于何种工作模式?为何这样做?及IIC总线上为何需增加上拉电阻?其
        直奔主题,以下是以下关于IIC总线应用中所需要理解的特性:1、GPIO应处于何种工作模式?    解:IIC总线通信使用两根新,分别是SDA和SCL,其IO工作模式通常需要配置为开漏输出。因为IIC总线是允许多个设备共享同一总线的,所以所有设备都可以将总线拉低,但不会相互冲突......
  • 02.工厂模式设计思想
    02.工厂模式设计思想目录介绍01.工厂模式设计1.1工厂模式类型1.2工厂模式思考1.3思考一个题目02.简单工厂介绍2.1简单工厂背景2.2简单工厂定义2.3简单工厂结构2.4简单工厂案例2.5简单工厂分析2.6简单工厂场景2.7简单工厂不足03.工厂方法介绍3.1......
  • 数据质量为什么差?代价是什么?
    如今,许多数字企业都认为自己是数据驱动的。通过各种软件解决方案,数据无处不在,收集起来也非常方便,这使得企业能够被动地收集大量数据,并将其应用于决策制定。然而,人们往往很容易在不考虑数据质量的情况下查看仪表盘和工具。Gartner估计数据质量低下导致企业损失平均每年1290万......
  • RabbitMQ系列学习笔记(三)--工作队列模式
    文章目录一、工作队列模式原理二、工作队列模式实战1、抽取工具类2、消费者代码3、生产者代码4、查看运行结果本文参考尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmqRabbitMQ详解Centos7环境安装Erlang、RabbitMQ详细过程(配图)一、工作队列模式原理与......
  • 前端开发设计模式——命令模式
    目录一、命令模式的定义和特点1.定义:         2. 特点:二、命令模式的结构与原理1.结构:2.原理:三、命令模式的实现方式1.定义接口命令:2.创建具体的命令类:3.定义接收者:4.创建调用者:四、命令模式的使用场景1.界面按钮的点击操作:    1.1 ......
  • FactoryBean(利用工厂制造复杂的bean)
    可以说FactoryBean创建的对象的生命周期管理取决于其是否为单例对象以及是否实现了特定的生命周期管理接口。对于单例对象,生命周期由Spring容器管理;而对于多例对象,生命周期由Java虚拟机管理。容器仅负责管理FactoryBean实例的生命周期,而不负责FactoryBean所创建对象......
  • Sharding-JDBC标准模式详解
    Sharding-JDBC标准模式详解一.为什么要使用标准模式?Sharding-JDBC的标准模式就配置而言比inline模式繁琐多了,那为什么要使用标准模式呢Sharding-JDBC作为ApacheShardingSphere生态中的一款轻量级Java框架,提供了数据分片、读写分离、分布式事务和数据库治理等核心功......
  • WSL2 提示 NAT 模式下的 WSL 不支持 localhost 代理。
    wsl:检测到localhost代理配置,但未镜像到WSL。NAT模式下的WSL不支持localhost代理。意思是说你在宿主机上启用了代理设置,指向localhost(宿主自己),但是WSL虚拟机是处在一个NAT的子网下的,没有设置指向宿主的代理。要想让WSL虚拟机使用宿主机的代理,就需要设置指向宿......
  • 【c#】我们为什么要用 yield return
    【c#】我们为什么要用yieldreturn明尼苏达的微笑嗯嗯,你说的都对​关注他 43人赞同了该文章声明:本文部分内容来自《moreeffectivec#》,特此声明c#里面的yieldreturn没什么高大上的,就是一个一个的return。但是我们不能小看这种用法,他能给编......