工厂方法模式(Factory Method Pattern)在JAVA中的应用

 

JAVA设计模式是一套被广泛认可的解决特定问题的最佳实践。在面向对象的软件设计中,设计模式可以帮助开发者构建可维护、可扩展和灵活的软件系统。本文将介绍工厂方法模式,这是一种创建型设计模式,它提供了一种创建对象的最佳方式。

## 1. 工厂方法模式简介

工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。这种模式让类的实例化推迟到子类进行。

## 2. 模式的结构

工厂方法模式主要包含以下几个角色:

- **抽象产品类(Product)**:这是声明产品对象的接口。
- **具体产品类(Concrete Product)**:这些类实现了抽象产品类,并由工厂方法创建。
- **抽象工厂类(Creator)**:这是一个包含创建产品对象的工厂方法的接口。
- **具体工厂类(Concrete Creator)**:这些类实现了工厂方法,它们生产并返回具体产品类的实例。

## 3. 模式的实现

以下是一个简单的JAVA示例,展示如何实现工厂方法模式:

```java
// 抽象产品类
public interface Product {
    void show();
}

// 具体产品类A
public class ConcreteProductA implements Product {
    @Override
    public void show() {
        System.out.println("Product A");
    }
}

// 具体产品类B
public class ConcreteProductB implements Product {
    @Override
    public void show() {
        System.out.println("Product B");
    }
}

// 抽象工厂类
public interface Creator {
    Product factoryMethod();
}

// 具体工厂类A
public class ConcreteCreatorA implements Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

// 具体工厂类B
public class ConcreteCreatorB implements Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Creator creatorA = new ConcreteCreatorA();
        Product productA = creatorA.factoryMethod();
        productA.show();

        Creator creatorB = new ConcreteCreatorB();
        Product productB = creatorB.factoryMethod();
        productB.show();
    }
}
```

在这个例子中,`Creator` 是一个抽象工厂接口,`ConcreteCreatorA` 和 `ConcreteCreatorB` 是两个具体的工厂类,它们实现了 `Creator` 接口的 `factoryMethod` 方法来创建 `Product` 的实例。
`Product` 是一个抽象产品接口,`ConcreteProductA` 和 `ConcreteProductB` 是实现了 `Product` 接口的具体产品类。

客户端代码演示了如何使用具体工厂类来创建具体产品类的实例。

## 4. 模式的优点

- **代码解耦**:通过使用工厂方法模式,类的实例化过程与客户端代码分离,使得客户端代码与具体产品类解耦。
- **易于扩展**:当需要添加新的产品类时,只需添加一个具体的产品类和一个对应的具体工厂类,而无需修改现有的客户端代码。
- **提高抽象性**:通过将产品的实例化过程封装到工厂类中,可以更容易地对产品进行抽象和扩展。

## 5. 模式的使用场景

- 当一个类不知道它所必须创建的具体类的时候。
- 当一个类希望其子类来指定创建的对象时。
- 当类的具体实例化过程比较复杂,或者希望将对象的创建和使用分离时。

## 6. 结语

工厂方法模式是一种非常实用的设计模式,它通过将对象的创建和使用分离,提高了代码的灵活性和可维护性。在JAVA开发中,合理运用工厂方法模式可以有效地解决对象创建过程中的耦合问题,使得系统更加健壮和易于扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day8:学习尚上优选项目

学习计划:完成尚硅谷的尚上优选项目 学习进度:尚上优选项目 知识点: 五、尚上优选微信小程序端 商品详情页 需求分析 页面效果功能分析对应接口 CompletableFuture异步编排 ⅰ. 问题引入并发、串行和并行CompletableFuture概述创建异步对象…

编程规范(保姆级教程)

文章目录 为什么需要编程规范?💡代码检测工具 ESLint💡代码格式化 Prettier💡ESLint 与 Prettier 配合解决代码格式问题eslint支持ts约定式提交规范Commitizen助你规范化提交代码什么是 Git Hooks使用 husky commitlint 检查提交…

探索设计模式的魅力:MVVM模式在AI大模型领域的创新应用-打破传统,迎接智能未来

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 MVVM模式在AI大模型领域的创新应用-打破传统迎接智能未来 🚀 “在人工智能的领域里&a…

算法训练营第37天|LeetCode 738.单调递增的数字 968.监控二叉树

LeetCode 738.单调递增的数字 题目链接: LeetCode 738.单调递增的数字 解题思路: 从后向前遍历,当不满足递增条件时,当前位置赋值为9,前一位减一。之后记录不满足位置,将后续全部赋值为9. 代码&#x…

【springboot】项目启动时打印全部接口方法

方法:在你springboot项目的基础上,创建下面的类: package com.llq.wahaha.listener;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework…

【Entity Framework】如何使用EF中的生成值

【Entity Framework】如何使用EF中的生成值 文章目录 【Entity Framework】如何使用EF中的生成值一、概述二、默认值三、计算列四、设置主键五、显示配置值生成六、设置日期/时间值生成6.1 创建时间戳6.2 更新时间戳 七、替代值生成八、无值生成九、总结 一、概述 数据库列的值…

DHCP抓包分析

DHCP动态路由配置协议,是C/S架构,由DHCP服务器为客户端动态分配IP信息。 DHCP客户端首次接入网络数据交互过程: 如何解决IP地址的冲突: ▫ DHCP服务器端:收到DHCP DISCOVER报文时,给客户端分配IP地址前会发…

【C++第三阶段】stackqueue容器

以下内容仅为当前认识,可能有不足之处,欢迎讨论! 文章目录 stack容器queue容器 stack容器 是什么?功能是什么?常用接口是什么?局限性有哪些?优势又有哪些? 栈容器,先进…

error-ckeditor-duplicated-modules 在vue中引入ckeditor插件报错

报错原因: 由于集成了webpack,统一引入了ckeditor ,但是页面里面我们又通过import引入了一遍,所以导致引入重复了 解决: ckeditor本身除了基本的一些功能,其他基本全靠插件引入,所以想加功能必…

速看!这8道嵌入式面试题你都会吗?

大家好,我是知微! 正逢求职季,分享一些嵌入式面试当中经常会遇到的题目,希望这些干货对小伙伴们面试有用哦! 1、介绍一下static关键字的作用 在C语言中,static 关键字有几种不同的作用,根据其…

谷歌推出Vids:AI驱动的PowerPoint,重新定义演示文稿的未来|TodayAI

不管你喜不喜欢,找到集成了AI技术以简化常见任务的工具和服务变得越来越容易。谷歌的应用套件迅速成为了一个集成了Gemini AI的产品中心,这些产品可以在工作场所到你的家中的任何地方使用。例如,如果在工作中做演示一直是你的痛点&#xff0c…

linux环境下安装 OpenDevin 遇到的问题以及解决方法

OpenDevin: Code Less, Make More https://github.com/OpenDevin/OpenDevin OpenDevin,一个引人注目的开源项目,旨在重现并超越Devin的卓越能力。Devin,作为一位拥有卓越技术实力的自主AI软件工程师,不仅能够执行高度复杂的工程任…

【AcWing】蓝桥杯集训每日一题Day25|最大公约数|算数基本定理|4199.公约数(C++)

4199.公约数 4199. 公约数 - AcWing题库难度:中等时/空限制:1s / 256MB总通过数:2801总尝试数:7059来源:AcWing第30场周赛算法标签最大公约数试除法二分 题目内容 给定两个正整数 a 和 b。 你需要回答 q 个询问。 每…

git操作码云(gitee)创建仓库到上传到远程仓库

想必有的小伙伴在为上传到码云远程仓库而感到烦恼吧!本篇为大家详细讲解实现过程,跟着我的步伐一步一步来。 我就当大家已经注册好了码云 一、在码云上需要的操作 接下来我们需要使用到 git 了 二、git 上的操作 到了咋们的git了,开整 首…

外包干了3天,技术退步明显.......

先说一下自己的情况,大专生,19年通过校招进入杭州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Terraform 状态不同步处理

背景 在使用 Terraform 创建 TencentCloud TKE 的时候,手贱把 node pool 删掉了。导致执行 destroy, plan 都会报错。 │ Error: [TencentCloudSDKError] CodeInternalError.UnexpectedInternal, Messagerelated node pool query err(get node pool failed: [E501…

Python如何安装第三方模块

cmd窗口中使用pip install命令安装 1、键盘按下win R,然后在输入框中输入cmd,回车,就打开了cmd窗口。 下图的运行框会出现到屏幕左下角。 2、输入下面的命令,回车即可。 pip install xxx # xxx为要安装的模块名 如图所示&…

【13137】基于TQM的人力资源管理

目录 1.单选题 2.多选题 3.名词解释题 4.简答题 1.单选题

中通科技数仓数据治理实践

目录 一、背景 1.1 中通数仓架构介绍 1.2 中通数仓层级划分 1.3 中通数据现状 1.4 中通数仓现面临的压力 二、数据仓库具体实践 2.1 时效治理 2.1.1 数据入仓治理 2.1.2 核心模型治理 2.2 存储治理 2.3 内存治理 2.3.1 内存浪费治理 2.3.2 数据倾斜治理 2.3.3 内…

算法设计与分析实验报告c++java实现(ACM面试题、字符串匹配算法、循环赛日程安排问题、分治法求解最大连续子序列和、动态规划法求解最大连续子序列和)

一、 实验目的 1.加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握; 2.提高学生利用课堂所学知识解决实际问题的能力; 3.提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、【ACM、…