Java设计模式 三 工厂方法模式 (Factory Method Pattern)

工厂方法模式 (Factory Method Pattern) 是一种常见的创建型设计模式,旨在通过定义一个接口来创建对象,而将实例化对象的具体类延迟到子类中。工厂方法模式允许客户端通过工厂方法来创建对象,而不需要直接调用构造函数,这样可以减少代码中的耦合度,并允许在不修改客户端代码的情况下更改对象的创建过程。

1. 工厂方法模式的结构

工厂方法模式的核心思想是将对象的创建与使用分开,定义一个工厂方法用于创建对象,并让子类实现这个工厂方法。

  • Product(产品接口):定义了产品的接口。
  • ConcreteProduct(具体产品):实现了 Product 接口,具体产品类。
  • Creator(创建者):声明了工厂方法,该方法返回一个 Product 对象。通常是抽象类或接口。
  • ConcreteCreator(具体创建者):实现了 Creator 类,并实现了工厂方法来返回具体的产品对象。

2. 工厂方法模式的优点

  • 扩展性强:增加新的具体产品类时,只需要添加新的 ConcreteProduct 类和新的 ConcreteCreator 子类,而不需要修改现有的客户端代码。
  • 解耦合:客户端不需要知道产品类的具体实现,只需依赖产品接口和工厂接口,可以降低类之间的耦合度。
  • 提高代码可维护性:如果产品的创建方式发生变化,只需要在工厂方法中进行修改,不会影响到客户端代码。

3. 工厂方法模式的缺点

  • 类的数量增加:为了每种产品提供一个工厂类,会导致系统中的类数量增加,可能使系统变得更复杂。
  • 灵活性差:如果需要创建大量不同类型的对象时,工厂方法模式的实现会比较冗长,维护成本高。

4. 工厂方法模式的实现

1) 定义产品接口

产品接口定义了不同类型产品的公共方法。

public interface Product {
    void doSomething();
}
2) 具体产品类

具体产品类实现了产品接口。

public class ConcreteProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("ConcreteProductA doing something.");
    }
}

public class ConcreteProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("ConcreteProductB doing something.");
    }
}
3) 定义创建者接口

创建者接口声明了工厂方法,用来创建产品对象。

public abstract class Creator {
    public abstract Product factoryMethod();
}
4) 具体创建者类

具体创建者类实现了工厂方法,返回具体的产品实例。

public class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

public class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}
5) 客户端使用工厂方法

客户端只需要依赖于 Creator 类,而无需知道产品的具体实现。通过工厂方法来创建产品实例。

public class Client {
    public static void main(String[] args) {
        Creator creatorA = new ConcreteCreatorA();
        Product productA = creatorA.factoryMethod();
        productA.doSomething();  // 输出: ConcreteProductA doing something.
        
        Creator creatorB = new ConcreteCreatorB();
        Product productB = creatorB.factoryMethod();
        productB.doSomething();  // 输出: ConcreteProductB doing something.
    }
}

5. 工厂方法模式的应用场景

  • 当一个类不知道它所需要的对象的具体类时。通过使用工厂方法,客户端可以依赖接口来获取对象,而无需关心具体的实现类。
  • 当类的实例化过程可能会发生变化时。如果产品的创建过程需要进行修改,工厂方法模式使得客户端不需要修改,只需修改工厂方法即可。
  • 需要通过子类来决定产品的具体类型时。子类可以通过重写工厂方法来创建不同的产品实例。

6. 工厂方法模式与简单工厂模式的比较

  • 简单工厂模式 (Simple Factory):通过一个静态方法来创建对象,客户端调用时直接提供产品类型(通常是枚举或字符串),而不需要依赖工厂接口和具体的工厂类。

    • 缺点:简单工厂模式会使得工厂方法与客户端耦合,产品类型的增加导致修改工厂方法,违反了“开闭原则”(对扩展开放,对修改封闭)。
  • 工厂方法模式:工厂方法模式定义了一个工厂接口,允许不同的工厂子类来创建不同的产品。相比于简单工厂,工厂方法模式更加灵活,符合“开闭原则”。

7. 总结

  • 工厂方法模式 适用于当你需要生成不同类型的产品时,并且希望通过工厂方法来解耦产品的创建与使用逻辑。
  • 它将对象的创建推迟到子类中,并通过工厂方法来返回具体的产品实例,减少了系统中类之间的耦合。
  • 当系统中的产品种类较多时,使用工厂方法模式能够方便地扩展和修改产品的实现,而不影响现有的客户端代码。

通过这种方式,工厂方法模式可以帮助你构建一个灵活且易于扩展的系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957357.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮,但是2025年更新之后这个按钮就不提供了,所以需要使用新的方式下载 ps:给自己的网站推广下~~(国内直连GPT/Claude) 新的下载方式1 首先打开vscode商店官网:vscode插件下载…

Maven多环境打包方法配置

简单记录一下SpringBoot多环境打包配置方法,分部署环境和是否包含lib依赖包两个维度 目录 一、需求说明二、目录结构三、配置方案四、验证示例 一、需求说明 基于Spring Boot框架的项目分开发,测试,生产等编译部署环境(每一个环境…

异或和之和

题目: 0异或和之和 - 蓝桥云课 异或和之和 题目描述 给定一个数组 Ai​,分别求其每个子段的异或和,并求出它们的和。或者说,对于每组满足 1≤L≤R≤n 的 L,R,求出数组中第 L 至第 R 个元素的异或和。然后输出每组 …

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)

一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念,实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 (Deferred shading)技术。 按照本文代码实现后,可以实现以下…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

Java基础——概念和常识(语言特点、JVM、JDK、JRE、AOT/JIT等介绍)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

Java设计模式:创建型模式→建造者模式

Java 建造者模式详解 1. 定义 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;允许使用多个简单的对象一步步构建一个复杂的对象。该模式使用一个建造者对象来构造一个最终的对象&#xff0c;提供清晰的分步构建流程&#xff0c;从而使得…

从CRUD到高级功能:EF Core在.NET Core中全面应用(三)

目录 IQueryable使用 原生SQL使用 实体状态跟踪 全局查询筛选器 并发控制使用 IQueryable使用 在EFCore中IQueryable是一个接口用于表示可查询的集合&#xff0c;它继承自IEnumerable但具有一些关键的区别&#xff0c;使得它在处理数据库查询时非常有用&#xff0c;普通集…

C语言之小型成绩管理系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之小型成绩管理系统 目录 设计题目设计目的设计任务描述设计要求输入和输出要求验收要…

Linux中DataX使用第一期

简介 DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, databen…

Windows配置frp内网穿透实现远程连接

仅个人记录 本文仅介绍客户端的配置 1. 开始 frp分为服务端和客户端&#xff0c;为实现内网穿透需要同时配置服务端和客户端&#xff0c;并且版本保持一致&#xff0c;可以前往 frp github下载 本文使用 0.51.2 版本&#xff0c;从GitHub下载并解压&#xff0c;得到如下文件…

PHP同城配送小程序

&#x1f680; 同城极速达——您生活中的极速配送大师 &#x1f4f1; 一款专为现代都市快节奏生活量身打造的同城配送小程序&#xff0c;同城极速达&#xff0c;集高效、便捷、智能于一身&#xff0c;依托ThinkPHPGatewayWorkerUniapp的强大架构&#xff0c;巧妙融合用户端、骑…

ESP32云开发二( http + led + lcd)

文章目录 前言先上效果图platformio.iniwokwi.tomldiagram.json源代码编译编译成功上传云端完结撒花⭐⭐⭐⭐⭐ 前言 阅读此篇前建议先看 此片熟悉下wokwi https://blog.csdn.net/qq_20330595/article/details/144289986 先上效果图 Column 1Column 2 platformio.ini wokwi…

分布式搜索引擎02

1. DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1. DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c…

reactor框架使用时,数据流请求流程

1. 我们在Flux打开时&#xff0c;可以看到 public abstract class Flux<T> implements CorePublisher<T> { 2. public interface CorePublisher<T> extends Publisher<T> {void subscribe(CoreSubscriber<? super T> subscriber); } Publish…

E-Prime2实现List嵌套

用E-Prime实现一个简单的List嵌套&#xff0c;实验流程基于斯特鲁程序&#xff08;色词一致/不一致实验&#xff09;。 首先File-New&#xff0c;新建一个空白项目 此时生成流程如下 Experiment Object是实验中被用到的流程或者控件对象&#xff0c;SessionProc是总流程&#x…

web-view环境下,H5页面打开其他小程序

在Web-view环境下&#xff0c;H5页面无法直接打开其他小程序。正确的实现方式是先从H5页面跳转回当前小程序&#xff0c;再由当前小程序跳转到目标小程序。具体实现方法如下&#xff1a; H5页面跳转回小程序时&#xff0c;调用wx.miniProgram.navigateTo()方法。 小程序跳转到…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者&#xff1a;来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫&#xff0c;将网站索引到 Elasticsearch 中&#xff0c;然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo&#xff1a;https://github.com/Gunner…

Linux系统的第一个进程是什么?

Linux进程的生命周期从创建开始&#xff0c;直至终止&#xff0c;贯穿了一个进程的整个存在过程。我们可以通过系统调用fork()或vfork()来创建一个新的子进程&#xff0c;这标志着一个新进程的诞生。 实际上&#xff0c;Linux系统中的所有进程都是由其父进程创建的。 既然所有…

《冲动》V1.6官方学习版

《冲动》官方版 https://pan.xunlei.com/s/VODiYvUAE1lECHcq66BR1np_A1?pwdfxc6# 具有侦探小说、戏剧和恐怖元素的惊悚片。 主角结束了漫长的商务旅行回到家&#xff0c;他的妻子和年幼的儿子热切地等待着他。然而&#xff0c;当他到达时&#xff0c;他发现有些不对劲&#x…