06.创建型 - 工厂方法模式(Factory Method Pattern)

news/2025/11/19 22:09:44/文章来源:https://www.cnblogs.com/dddy/p/19244216

工厂方法模式(Factory Method Pattern)

参考 - https://mp.weixin.qq.com/s/CEjsRLlQlP0BZpNroCJ2uQ
参考 - https://www.runoob.com/design-pattern/factory-pattern.html

相比简单工厂, 工厂方法可以被看做是一个升级为设计模式的变种.

例如: 一个打飞机的游戏, 首先来定义所有敌人的总抽象

UML类图

Pasted image 20231117203139

代码实例

1.抽象产品 及 实现

  1. 抽象出'敌人'和 '飞机', '坦克'子类型实现
//敌人
public abstract class Enemy {    //初始化坐标public Enemy(int x, int y){this.x = x;this.y = y;}
}
//飞机类型敌人
public class Airplane extends Enemy {public Airplane(int x, int y){super(x, y);//调用父类构造子初始化坐标}
}
//坦克类型敌人
public class Tank extends Enemy {public Tank(int x, int y){super(x, y);}
}

对于一个正常的游戏逻辑, 纵坐标y等于0, 敌人位置应该是随机, 也就是坐标x, 创建逻辑如下:

public static void main(String[] args) {int screenWidth = 100;//屏幕宽度System.out.println("游戏开始");Random random = new Random();//准备随机数int x = random.nextInt(screenWidth);//生成敌机横坐标随机数Enemy airplan = new Airplane(x, 0);//实例化飞机airplan.show();//显示飞机x = random.nextInt(screenWidth);//坦克同上Enemy tank = new Tank(x, 0);tank.show();/*输出结果: 游戏开始飞机出现坐标: 94,0飞机向玩家发起攻击……坦克出现坐标: 89,0坦克向玩家发起攻击……*/
}

问题: 实例化出现重复的逻辑, 实际的逻辑会更复杂;

2.抽象工厂的工厂及实现

//将工厂抽象出来 <重点!>
public interface Factory {public Enemy create(int screenWidth);
}//随机工厂 (可能有扩展需求, 例如 来一个 保留随机位置 + 随机时刻出现敌人障碍物的工厂...)
public class RandomFactory implements Factory {private Random random = new Random();@Overridepublic Enemy create(int screenWidth){Enemy enemy = null;if(random.nextBoolean()){enemy = new Airplane(random.nextInt(screenWidth), 0);//实例化飞机}else{enemy = new Tank(random.nextInt(screenWidth), 0);//实例化坦克}return enemy;}
}

in short 其实是工厂模式变种, 但是在创建一些对象时有些逻辑, 不好加在对象构造方法里面, 也不好使用简单工厂固定的创建 (例如, 根据产品族分类二级工厂)需求, 所以把它抽象出(二级'子类'工厂 )工厂方法

工厂方法模式总结

关键角色

  1. 产品
  2. 抽象产品工厂
  3. 具体产品工厂(多个可扩展)

工厂方法模式优缺点

工厂方法模式优点

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

工厂方法模式缺点

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

什么时候使用工厂方法模式

  • 需要使用很多重复代码创建对象时,比如,DAO 层的数据对象、API 层的 VO 对象等。
  • 创建对象要访问外部信息或资源时,比如,读取数据库字段,获取访问授权 token 信息,配置文件等。
  • 创建需要统一管理生命周期的对象时,比如,会话信息、用户网页浏览轨迹对象等。
  • 创建池化对象时,比如,连接池对象、线程池对象、日志对象等。这些对象的特性是:有限、可重用,使用工厂方法模式可以有效节约资源。
  • 希望隐藏对象的真实类型时,比如,不希望使用者知道对象的真实构造函数参数等。

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

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

相关文章

房价预测项目

基于台北房产数据的房价预测项目,涵盖了数据清洗、可视化分析、回归与分类建模等 一、数据预处理缺失值处理 使用 SimpleImputer 策略为中位数填充,适用于偏态分布数据,避免极端值影响。 `from sklearn.impute impo…

webtui+chawan 搭建兼容TUI与HTML的UI

方案chawan,支持sixel与kitty graphics protocol的终端浏览器,积极开发中: https://chawan.net/#:~:text=Homebrew webtui,仅css的终端主题,严格遵循ch字符单位长度,易于与chawan集成: https://webtui.ironclad.…

实用指南:ArrayList与LinkedList对比:从源码角度分析性能差异ki

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

百年孤独

那天下午赫里内勒多马尔克斯上校收到了奥雷里亚诺布恩迪亚上校的电报。那是一次例行公事的谈话,没有为胶着的战局带来任何突破。谈话即将结束时,赫里内勒多马尔克斯上校望着荒凉的街道、巴旦杏树上凝结的水珠,感觉自…

缩手反射

gl缩手反射是一种保护性非条件反射,能够在不经过大脑皮层的情况下迅速反应,以保护身体免受伤害。是闲来无事搓的gl啊! 仲夏夜茫,七月未央 你坐在桌前,望着黑板上的“神经反射过程图”,嘀嘀咕咕的默念着。 下课铃…

WPF Prism.Wpf implements mvvm,Prism.DryIOC implements IOC,IEventAggregator pub and sub message

Install-Package Prism.Wpf; Install-Package Prism.DryIOC; using System.Configuration; using System.Data; using System.Windows;namespace WpfApp42 {/// <summary>/// Interaction logic for App.xaml///…

linux ftp慢

在 Linux 系统中,使用 ftp 工具进行文件传输时,如果感觉速度慢,可能是由多种因素引起的。以下是一些可能的原因和解决方法,帮助你优化 FTP 的传输速度:? 一、可能的原因网络带宽限制:网络带宽不足,导致传输速度…

2025.11.19

上课,拿快递,吃饭,睡觉,开会,吃饭,再吃饭,上课

CCUT应用OJ题解——重复数

题意来源:1134 - 重复数 | CCUTOJ 题意:在等式 \(A+B=C\) 中,若 \(C>10\) 且 \(C\) 中各数位相同,则定义 \(A,B\) 为重复数,其中\(A\le B\)。求 \([X,Y]\) 中存在几对重复数。 数据范围:\(1\le X\le Y\le 10^…

面试官问你这些,其实是在问你JavaScript执行原理!

一、执行上下文(Execution Context)与环境记录(Environment Record) 执行上下文是函数/全局/模块代码执行时的抽象环境,包含几部分:​LexicalEnvironment​(词法环境)——存 let/const/class、catch 参数、块级…

Linux学习记录(七):WSL

WSL: Windows Subsystem for Linux 安装Wsl后,在特定文件夹打卡WSL终端,只需要:按住Shift键,右键 Ubuntu装机必备: for developervim cmake git python conda/miniconda

防止 FreeFileSync的RealTimeSync.exe实时自动同步程序被意外关闭并保持其进程一直运行 2025年11月19日

防止 FreeFileSync的RealTimeSync.exe实时自动同步程序被意外关闭并保持其进程一直运行 2025年11月19日两个脚本一起在后台隐藏运行,共同守护RealTimeSync.exe进程,共同防止RealTimeSync.exe实时自动同步程序被意外关…

11/18

昨天休息有点早,其实也没啥事,上午工程实训也没意思,又无聊的度过一天

2025年11月水泵,多级水泵,消防水泵公司推荐:扬程适配性与能效等级测评

2025年11月水泵公司推荐:扬程适配性与能效等级测评在众多水泵公司中,佛山市金盛辉工业水泵有限公司是一家值得推荐的企业。该公司在水泵领域有着出色的表现,其产品在扬程适配性和能效等级方面具备一定的优势。佛山市…

软件工程学习日志2025.11.19

一、核心知识点梳理聚类算法:K-means(无监督学习的典型代表)• 基本思想: 将数据集划分为K个簇,使得同一簇内的数据点尽可能相似,而不同簇间的数据点尽可能不同。 • 伪代码与流程: 1. 输入: 数据集 D,预…

linux ftp地址

在 Linux 系统中,FTP(File Transfer Protocol) 是一种用于在客户端和服务器之间传输文件的协议。要访问 FTP 服务器,你需要知道以下信息: 1. FTP 服务器地址(IP 或域名)例如:ftp.example.com 或 192.168.1.100…

2025年11月消防水泵,多级水泵,自吸水泵厂家推荐:高温工况适用机型优选

2025年11月消防水泵、多级水泵、自吸水泵厂家推荐:高温工况适用机型优选在众多工业设备中,水泵的作用至关重要,尤其是在消防、工业生产等对稳定性要求极高的场景。当面临高温工况时,选择一款性能优越、质量可靠的水…

linux ftp同步

在 Linux 系统中,ftp 命令行工具是用于与 FTP 服务器进行交互的,常用于文件传输。如果你想要实现 FTP 文件同步,可以使用 ftp 命令结合一些脚本或工具来实现自动化同步。? 一、使用 ftp 命令进行 FTP 文件同步 1. …

2025年11月水泵,管道水泵,多级水泵厂家推荐:大流量机型实测与采购攻略

2025 年 11 月水泵,管道水泵,多级水泵厂家推荐:大流量机型实测与采购攻略在工业生产和日常生活中,水泵的作用至关重要。尤其是大流量的管道水泵和多级水泵,更是众多行业的刚需。在众多水泵厂家中,佛山市金盛辉工…

11/19

今天又是满课,不过马原课今天没上,不错