当前位置: 首页 > news >正文

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

工厂方法模式(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.zskr.cn/news/54597.html

相关文章:

  • 实用指南:ArrayList与LinkedList对比:从源码角度分析性能差异ki
  • 百年孤独
  • WPF Prism.Wpf implements mvvm,Prism.DryIOC implements IOC,IEventAggregator pub and sub message
  • 缩手反射
  • 2025.11.19
  • 面试官问你这些,其实是在问你JavaScript执行原理!
  • Linux学习记录(七):WSL
  • 2025年11月消防水泵,多级水泵,自吸水泵厂家推荐:高温工况适用机型优选
  • 11/19
  • Longest Palindromic Substring最长回文子串-Manacher算法
  • [20251113]建立完善fffext.sh脚本.txt
  • 解码线程调度与信号响应
  • extern C的深入理解
  • XPath表达式解析与应用
  • 2025中国防晒品牌榜出炉!按肤质/场景选!
  • linux ftp使用
  • 落山基唬人队 第二次团队作业——原型设计+概要设计
  • #20232329 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • IDEA Debug使用方法
  • 初级阶段:无法连接虚拟机的故障排查思路
  • 高性能计算实践- 遥遥领先!看看 streaming store 在矩阵转置中有多少提升
  • AT_arc195_e [ARC195E] Random Tree Distance gemini-3 Pro题解
  • 关于jupyterNotebook 的虚拟环境配置
  • 2025云南冻品批发/冷冻食品批发厂家最新TOP5权威推荐
  • linux ftp 用户创建
  • [豪の算法奇妙冒险] 代码随想录算法训练营第一天 | 704-二分查找、27-移除元素、977-有序数组的平方
  • 完整教程:【C语言实战(44)】C语言打造全能简易计算器:突破运算极限
  • 【第7章 I/O编程与异常】 `for line in f`及其需要的文件打开模式
  • Google 王炸!Gemini 3 Pro 上线:前端能力、代码理解全面进化。
  • 【Agent】MemOS 源码笔记---(1)--基本概念