当前位置: 首页 > 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.hn-smt.com/news/51588/

相关文章:

  • 接上一篇views.py视图内容整理的最终使用方法,包括自定义action,在api请求时的不同点以及注意事项
  • webtui+chawan 搭建兼容TUI与HTML的UI
  • 2025.11.19
  • 面试官问你这些,其实是在问你JavaScript执行原理!
  • linux ftp同步
  • XPath表达式解析与应用
  • linux ftp代码
  • 初级阶段:无法连接虚拟机的故障排查思路
  • linux ftp 端口查看
  • AT_arc195_e [ARC195E] Random Tree Distance gemini-3 Pro题解
  • 空间变换层和自注意力机制
  • SPYSE团队独家专访:构建互联网基础设施搜索引擎的技术实践
  • c#构建日报
  • 102302156 李子贤 数据采集第三次作业
  • Cursor接入飞书MCP
  • linux framebuffer
  • 详细介绍:第八节_PySide6基本窗口控件_按钮类控件(QAbstractButton)
  • 三分稀疏图染色的多项式时间证明
  • Linux for OneNote
  • 在 RTE2025 大会,我看到了 AI 语音如何让机器学会「与人相处」丨社区来稿
  • 【C++】哈希表的搭建【开放定址法vs链地址法】
  • linux flash驱动
  • 视频融合平台EasyCVR助力守护渔业牧区安全与增效
  • 2025 最新推荐!精雕机厂家口碑排行榜,国际协会测评认证 + 多行业适配实力权威发布高校合作精雕机/东莞精雕机/广东精雕机公司推荐
  • 2025 最新限制器厂家权威推荐榜:国际测评认证 + 年产超 20 万套实力品牌,生产与服务全方位评估展现卓越制造能力限制器/扭力限制器/扭矩限制器公司推荐
  • 实用指南:智慧家政系统:未来家庭管理的核心技术解析
  • 移动端反射探针格式用什么比较合理
  • K8S集群1.30版本怎么执行命令进入容器
  • 2025年CAN通讯汽车喇叭定做厂家权威推荐榜单:客运汽车喇叭/电动汽车喇叭/货运汽车喇叭源头厂家精选
  • 上海AI创业公司排行榜:2025年创新力量与技术突破解析