工厂方法模式:创建对象的灵活与扩展

欢迎来到设计模式系列的第三篇文章!在前两篇文章中,我们已经学习了设计模式的基本概念以及单例模式的应用。

今天,我们将深入探讨第二个模式——工厂方法模式。

工厂方法模式简介

工厂方法模式是一种创建型设计模式,它提供了一种方法来创建对象,但是由子类决定具体要实例化的类是哪一个。这使得一个类的实例化延迟到了其子类。

工厂方法模式旨在解决对象创建过程中的灵活性和扩展性问题。

为什么需要工厂方法模式?

在软件开发中,我们经常会遇到需要根据不同的条件创建不同的对象的情况。如果直接在代码中使用new关键字来创建对象,会导致代码的紧耦合,不利于后续的维护和扩展。工厂方法模式通过将对象的创建过程封装在工厂类中,使得客户端代码与具体对象的创建过程分离,从而提高了代码的灵活性和可扩展性。

工厂方法模式的实现

工厂方法模式的核心思想是将对象的创建过程交给具体的工厂类来完成。我们来通过一个例子来理解这个模式。

假设我们正在开发一个游戏,游戏中有多种不同类型的武器,每种武器都有自己的攻击方式。我们可以使用工厂方法模式来创建这些武器。

首先,我们定义一个抽象的武器接口和多个具体的武器类:

public interface Weapon {void attack();
}public class Sword implements Weapon {@Overridepublic void attack() {System.out.println("挥动剑攻击");}
}public class Bow implements Weapon {@Overridepublic void attack() {System.out.println("拉弓射箭攻击");}
}public class Axe implements Weapon {@Overridepublic void attack() {System.out.println("挥动斧头攻击");}
}

接下来,我们定义一个抽象的武器工厂接口和多个具体的武器工厂类:

public interface WeaponFactory {Weapon createWeapon();
}public class SwordFactory implements WeaponFactory {@Overridepublic Weapon createWeapon() {return new Sword();}
}public class BowFactory implements WeaponFactory {@Overridepublic Weapon createWeapon() {return new Bow();}
}public class AxeFactory implements WeaponFactory {@Overridepublic Weapon createWeapon() {return new Axe();}
}

在这个例子中,每个具体的武器工厂类负责创建对应的武器对象。这样一来,我们就可以在客户端代码中通过工厂方法来创建武器,而不需要直接使用new关键字。

工厂方法模式的应用

让我们通过一个具体的例子来理解工厂方法模式的应用。假设我们正在开发一个商城系统,该系统需要支持多种支付方式,包括支付宝支付、微信支付等。

首先,我们定义一个支付接口和多个具体的支付类:

public interface Payment {void pay();
}public class Alipay implements Payment {@Overridepublic void pay() {System.out.println("使用支付宝支付");}
}public class WechatPay implements Payment {@Overridepublic void pay() {System.out.println("使用微信支付");}
}

接下来,我们定义一个抽象的支付工厂接口和多个具体的支付工厂类:

javaCopy code
public interface PaymentFactory {Payment createPayment();
}public class AlipayFactory implements PaymentFactory {@Overridepublic Payment createPayment() {return new Alipay();}
}public class WechatPayFactory implements PaymentFactory {@Overridepublic Payment createPayment() {return new WechatPay();}
}

在客户端代码中,我们可以根据需要选择合适的支付工厂来创建支付对象:

public class PaymentApplication {public static void main(String[] args) {PaymentFactory factory = new AlipayFactory();Payment payment = factory.createPayment();payment.pay();}
}

这样一来,我们可以根据不同的支付需求来选择合适的支付工厂,创建对应的支付对象,实现了代码的灵活性和可扩展性。

小结

工厂方法模式是一种非常有用的设计模式,它能够帮助我们实现对象的灵活创建,减少代码的耦合度,提高代码的可维护性和可扩展性。通过将对象的创建过程封装在工厂类中,我们可以轻松地在不同的场景下创建不同类型的对象。

在本篇文章中,我们深入探讨了工厂方法模式的概念、原理和实际应用。通过实际的案例,我们理解了工厂方法模式如何帮助我们创建灵活且可扩展的对象。在下一篇文章中,我们将继续学习其他有趣的设计模式,敬请期待!

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

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

相关文章

通讯协议057——全网独有的OPC HDA知识一之接口(十二)IOPCHDA_DataCallback

本文简单介绍OPC HDA规范的IOPCHDA_DataCallback(客户端接口)接口方法,更多通信资源请登录网信智汇(wangxinzhihui.com)。 1)HRESULT OnDataChange(dwTransactionID, hrStatus, dwNumItems, pItemValues, phrErrors) 此方法由客…

jmeter源码二次开发

本文以jmeter5.5为例,扩展“TCP Socket支持定长的返回字节流”功能。 一、 源码本地编译运行 1、在jmeter官网下载源码:jmeter各版本源码地址 2、在idea中用gradle导入jmeter源码,idea中要配置jdk,gradle,我用的是j…

详解mysql事务,事务并发安全问题的复现以及大事务的优化

好文推荐: 2.5万字详解23种设计模式 springboot 实现延时队列(超级实用) 2.5万字讲解DDD领域驱动设计 文章目录 1. 事务定义2. 事务特性(ACID)3. 事务并发问题4. 事务隔离级别5. 基础命令6. 脏读复现7. 不可重复读复现…

【快手小玩法-弹幕游戏】开发者功能测试报告提交模板

背景 快手有明确的要求,准入和准出更加严格,要求有明确的测试报告。格式如下: *本文参考字节wiki:CP侧测试报告模板(复制填写轻雀文档) 其他文章推荐:【抖音小玩法-弹幕游戏】开发者功能测试报告提交模板 一、前言…

Visual Studio编译出来的程序无法在其它电脑上运行

在其它电脑(比如Windows Server 2012)上运行Visual Studio编译出来的应用程序,结果报错:“无法启动此程序,因为计算机中丢失VCRUNTIME140.dll。尝试重新安装该程序以解决此问题。” 解决方法: 属性 -> …

10 mysql tiny/small/medium/big int 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 int 类类型的相关数据的存储 …

变长参数表的用法

变长参数表是一种允许函数接受不定数量和类型的参数的机制&#xff0c;它在C语言中经常用到&#xff0c;比如printf函数。要使用变长参数表&#xff0c;你需要包含<stdarg.h>头文件&#xff0c;它定义了一些宏和类型来处理变长参数。 首先&#xff0c;你需要在函数声明中…

服务器上使用screen的学习记录

服务器上使用screen 训练模型的时候&#xff0c;花费时间是很长的&#xff0c;不可能一直挂在桌面上。所以就想到用screen了。 记录一下简单的操作指令。 创建screen screen -S roof # 新建一个名字为name的窗口&#xff0c;并进入到该窗口中进入后打开环境&#xff0c;运…

RT-Thread 时钟管理

时间是非常重要的概念&#xff0c;和朋友出去游玩需要约定时间&#xff0c;完成任务也需要花费时间&#xff0c;生活离不开时间。操作系统也一样&#xff0c;需要通过时间来规范其任务的执行&#xff0c;操作系统中最小的时间单位是时钟节拍&#xff08;OS Tick&#xff09;。 …

CloudCompare 二次开发(10)——点云投影到平面

目录 一、概述二、代码集成三、结果展示一、概述 不依赖任何第三方点云相关库,使用CloudCompare编程实现点云投影到指定平面,具体计算原理见:PCL 点云投影到拟合平面 二、代码集成 1、mainwindow.h文件public中添加: void doActionProjectToPlane(); // 投影到平面2、…

机房安全之道:构筑坚固的网络防线

引言&#xff1a; 在数字化时代&#xff0c;机房成为了许多组织和企业的核心基础设施&#xff0c;承载着重要的数据和应用。然而&#xff0c;随着网络攻击日益猖獗&#xff0c;机房的安全性显得尤为重要。本文将深入探讨如何构建坚固的网络防线&#xff0c;保护机房免受攻击的方…

Solidity 小白教程:6. 引用类型, array, struct

Solidity 小白教程&#xff1a;6. 引用类型, array, struct 这一讲&#xff0c;我们将介绍solidity中的两个重要变量类型&#xff1a;数组&#xff08;array&#xff09;和结构体&#xff08;struct&#xff09;。 数组 array 数组&#xff08;Array&#xff09;是solidity常…

STL的学习之一

1&#xff09;STL扫盲 1&#xff09;C标准库和标准模板库是不一样的 2&#xff09;标准模板库是用泛型编程方式编写的函数或者类库; 3) SGI STL linux一般用&#xff0c;P.J.Plauger STL,visual2017 windows用 STL六大组件 : 容器&#xff0c;迭代器 STL 算法(说白了就是函数…

DataX DorisWriter 插件DorisStreamLoadObserver类详细解读

DorisStreamLoadObserver 类是一个用于将数据加载到 Doris&#xff08;以前称为 Palo&#xff09;数据库中并监视加载过程的 Java 类。该类提供了一组方法&#xff0c;用于构建 HTTP 请求、处理 HTTP 响应以及监控数据加载的状态。以下是每个方法的具体作用&#xff1a; Doris…

如何使用CSS实现一个自适应等高布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Flexbox 布局⭐ 使用 Grid 布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发…

基于OpenCV+Keras+tensorflow 实现的变电站作业管控平台源代码。含人脸识别考勤,移动目标跟踪,越线检测,安全措施检测,姿态识别等功能

#综述 使用该作业现场安全生产智能管控平台来实现变电站的安全生产的智能化管理&#xff0c;通过人脸识别功能进行人员的考勤&#xff1b; 通过人员、车辆的检测和识别来实现变电站的智能化管理&#xff1b;通过安全行为识别和安全区域报警功能来实现对变电站内人员和设备安全的…

python使用字典暴力解析wifi密码

前言 最近无wifi可用,搜到了很多高质量但是没有密码的WiFi,我在想应该可以用python调用常见的wifi字典包来暴力破解一下这些WiFi,也许可以成功 原理 使用pip install pywifi命令安装pywifi 使用它调用本机网卡,设置wifi加密方式,对字典包扫描密码逐个尝试 扫描失败的密码会被…

【若依框架RuoYi-Vue-Plus 图片回显不显示问题,OSS文件上传或者本地上传】

一、问题 1.设计表 product&#xff08;商品表&#xff09; 有 id &#xff08;id&#xff09; name&#xff08;商品名&#xff09;icon&#xff08;图标&#xff09; 2.使用若依代码生成功能&#xff0c;导入product表&#xff0c;代码生成。 3.将生成的代码导入到项目中得到…

专访张少光---国内著名牛散、实战专家

导读&#xff1a;新财富最佳分析师评选作为中国本土第一份市场化的分析师评选&#xff0c;自2003年开启至今已20年&#xff0c;通过公正、公平、公开的评选&#xff0c;与市场各方共同挖掘了大量优秀分析师。值此新财富最佳分析师评选20周年之际&#xff0c;我们期望通过《对话…

51单片机智能电风扇控制系统proteus仿真设计( 仿真+程序+原理图+报告+讲解视频)

51单片机智能电风扇控制系统仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 讲解视频1.主要功能&#xff1a;2.仿真3. 原理图4. 程序代码5.设计报告6. 设计资料内容清单 51单片机智能电风扇控制系统仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 仿真图…