工厂模式

什么是工厂模式?

工厂模式是一种创建模式,它定义了用于创建对象的接口,但让子类决定要实例化哪个类。工厂模式让类将实例化推迟到子类。

什么时候使用它?

当您具有“产品”继承层次结构并可能向其中添加其他产品时,请使用工厂模式。 (product指的是factory方法返回的对象)

问题

如果你不了解 simple factory,我建议你先学习一下。资源很多,但我的博客在这里。

工厂模式

之前,我们引入了简单工厂,我们可以生产各种汉堡,同时将对象创建与客户端代码解耦。我们的汉堡店已经成功盈利,现在我们想在不同的地区开设其他汉堡店。

orderburger 方法定义了向客户销售汉堡的流程。

// this is our clientpublic class burgershop {    public burger orderburger(burgertype type) {        // factory is responsible for object creation        burger burger = simpleburgerfactory.createburger(type);        burger.preparebun();        burger.grillpatty();        burger.addtoppings();        burger.wrap();        return burger;    }}

这完全没问题,但是如果我们开其他汉堡店怎么办?假设我们启动“seasideburgershop”,我们将创建 seasideburgershop 类并定义它自己的 orderburger()。问题是,他们可能会忘记添加配料或以错误的顺序进行操作。

有问题的海边汉堡店:

天工大模型 天工大模型

中国首个对标ChatGPT的双千亿级大语言模型

天工大模型 115 查看详情 天工大模型

public class seasideburgershop {    public burger orderburger(burgertype type) {        burger burger = simpleburgerfactory.createburger(type);        burger.preparebun();        burger.wrap(); // wrap a burger before grilling a patty??        burger.grillpatty();        // they forget to add toppings!!        return burger;    }}

为了防止这种情况发生,我们的汉堡店需要一个框架,定义他们执行流程的顺序以及要做什么,但仍然允许事情保持灵活性。

解决方案

工厂模式

汉堡店
这个抽象类有两个方法:orderburger() 和 createburger()。 orderburger() 定义要做什么以及该过程应按什么顺序完成。这可以防止汉堡店忘记某些流程或弄乱流程顺序。 creatburger() 是抽象方法,让子类决定制作哪种汉堡。

burgershop 子类
这些具体的汉堡店负责制作具体的汉堡。每个扩展 burgershop 的子类都定义了自己的 createburger() 实现。

汉堡
这个抽象类提供所有汉堡之间的通用接口并定义默认行为。

汉堡子类
这是我们的混凝土产品。只要扩展 burger 类,他们就可以通过重写方法来实现特定行为。

结构

工厂模式

java 中的实现

public enum burgertype {    beef,    chicken,    fish,    veggie}
public abstract class burger {    public burgertype type;    public list toppings = new arraylist();    public void preparebun() {        system.out.println("preparing a bun");    }    public void grillpatty() {        if (type == null) {            throw new illegalstateexception("pattytype is undefined");        }        system.out.println("grill a " + type + " patty");    }    public void addtoppings() {        for (string item : toppings) {            system.out.println("add " + item);        }    }    public void wrap() {        system.out.println("wrap a burger up");    }}
public class citystylebeefburger extends burger {    public citystylebeefburger() {        type = burgertype.beef;        list items = list.of("lettuce", "pickle slices", "tomato slice", "bbq sauce");        toppings.addall(items);    }}
public class citystyleveggieburger extends burger {    public citystyleveggieburger() {        type = burgertype.veggie;        list items = list.of("smoked paprika", "garlic chips", "crushed walnuts", "veggie sauce");        toppings.addall(items);    }}
public class seasidestylebeefburger extends burger {    public seasidestylebeefburger() {        type = burgertype.beef;        // localized toppings for beef burger in seaside area        list items = list.of("lettuce", "pickle slices", "tomato slice", "salty sauce");        toppings.addall(items);    }    // uses localized wrapping paper    @override    public void wrap() {        system.out.println("wrap with a paper with nice sea scenery");    }}
public class seasidestylefishburger extends burger {    public seasidestylefishburger() {        type = burgertype.fish;        // localized toppings for fish burger in seaside area        list items = list.of("red onion slices", "salty sauce", "fried shrimps");        toppings.addall(items);    }    // uses localized wrapping paper    @override    public void wrap() {        system.out.println("wrap with a paper with nice sea scenery");    }}
public abstract class burgershop {    // this method provides a framework for each burger shops to order burgers    public burger orderburger(burgertype type) {        burger burger = createburger(type);        burger.preparebun();        burger.grillpatty();        burger.addtoppings();        burger.wrap();        return burger;    }    // this is our factory method. subclasses will override this method,    // provide their own implementation, determine which kind of burger gets made.    public abstract burger createburger(burgertype type);}
public class cityburgershop extends burgershop {    @override    public burger createburger(burgertype type) {        return switch (type) {            case beef -> new citystylebeefburger();            case veggie -> new citystyleveggieburger();            default -> throw new illegalargumentexception("unknown city burger type");        };    }}
public class seasideburgershop extends burgershop {    @override    public burger createburger(burgertype type) {        return switch (type) {            case beef -> new seasidestylebeefburger();            case fish -> new seasidestylefishburger();            default -> throw new illegalargumentexception("unknown seaside burger type");        };    }}

输出:

Preparing a bunGrill a BEEF pattyAdd lettuceAdd pickle slicesAdd tomato sliceAdd BBQ sauceWrap a burger upcom.factories.factory.product.CityStyleBeefBurger@3d494fbf**********************Preparing a bunGrill a BEEF pattyAdd lettuceAdd pickle slicesAdd tomato sliceAdd salty sauceWrap with a paper with nice sea scenerycom.factories.factory.product.SeaSideStyleBeefBurger@7cd84586

陷阱

实现起来很复杂,因为我们需要创建大量的类来扩展抽象创建者或抽象产品。

与简单工厂的比较

简单工厂中,通常有一个工厂类来决定创建哪种类型的产品,而工厂模式可能会引入多个工厂。简单工厂经常使用静态方法创建对象,调用容易但扩展困难。另一方面,工厂方法在超类中使用抽象方法,它充当所有工厂和子类的接口,将为对象实例化提供具体的实现。

您可以在这里查看所有设计模式的实现。
github 存储库

附注
我是刚开始写科技博客,如果您对我的写作有什么建议,或者有任何困惑的地方,请留言!
感谢您的阅读:)

以上就是工厂模式的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/402218.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何通过手机恢复出厂设置(简单操作让你的手机焕然一新)
上一篇 2025年11月6日 19:52:45
WebShaper— 阿里通义推出的AI训练数据合成系统
下一篇 2025年11月6日 19:52:58

相关推荐

  • VSCode管理FPGA约束文件(高效编辑方法,时序约束指南)

    使用vscode高效编辑fpga约束文件的方法包括:1. 安装“better comments”和“bracket pair colorizer”等插件以提升可读性和编辑效率;2. 利用代码片段功能创建常用约束模板,如时钟和i/o约束,通过关键词快速插入以减少重复输入和错误;3. 使用支持正则表达式…

    2026年9月23日
    100
  • Android自定义开关UI实现教程:打造独特交互体验

    本教程旨在指导开发者如何在Android应用中实现高度定制化的开关UI,摆脱原生组件的限制。我们将探讨两种主要方法:一是利用功能丰富的第三方库快速构建复杂动画效果的开关;二是通过XML Drawable Selector自定义原生ToggleButton的外观,实现简洁高效的视觉定制。 在andro…

    2026年9月23日
    200
  • MICCAI 2020 | 基于3D监督预训练的全身病灶检测SOTA(预训练代码和模型已公开)

    MICCAI 2020 | 基于3D监督预训练的全身病灶检测SOTA(预训练代码和模型已公开)MICCAI 2020 | 基于3D监督预训练的全身病灶检测SOTA(预训练代码和模型已公开)MICCAI 2020 | 基于3D监督预训练的全身病灶检测SOTA(预训练代码和模型已公开)MICCAI 2020 | 基于3D监督预训练的全身病灶检测SOTA(预训练代码和模型已公开)

    ▊ 研究背景介绍 由于深度学习任务通常依赖大量标注数据,医疗图像的标注需要专业知识,标注人员需精确判断病灶的大小、形状、边缘等信息,甚至需要经验丰富的专家进行多次评估,这增加了深度学习在医疗领域应用的难度。 目前,尽管有一些公开数据集(如LIDC-IDRI、LUNA等)可供使用,但这些数据集的图像数…

    2026年9月23日 用户投稿
    200
  • ​​VSCode的超级生产力指南!这些快捷键让你的编码速度起飞​​

    VSCode的快捷键能显著提升编码效率,掌握核心快捷键如Ctrl/Cmd + P快速打开文件、Ctrl/Cmd + Shift + P调出命令面板、Ctrl/Cmd + D选择下一个匹配项、Alt/Option + Click多光标编辑、Ctrl/Cmd + Shift + L选择所有匹配项、F2重…

    2026年9月23日
    100
  • VSCode如何管理技术债务 VSCode代码质量跟踪的实用方法

    eslint、pylint等linter类扩展可实时识别代码问题,从源头减少技术债务;2. sonarlint能集成sonarqube规则,深度检测代码异味并提供修复建议;3. code metrics可量化函数圈复杂度等指标,帮助定位高风险代码;4. todo tree将todo、fixme等注释…

    2026年9月23日
    000
  • 为什么macOS系统被认为比Windows更少受到病毒和恶意软件的困扰?

    macOS受病毒困扰较少因用户基数小、系统架构安全、生态封闭及用户习惯好,但威胁正随市场份额增长而增加。 macOS系统相对较少受到病毒和恶意软件的困扰,这背后有多重因素共同作用,并非单一原因。虽然近年来针对Mac的威胁确实在增加,但整体感染率仍低于Windows平台。 用户基数与攻击目标 黑客开发…

    2026年9月23日
    800
  • VSCode搭建Angular开发环境(企业级前端,配置详解)

    企业级angular开发环境中,vscode必不可少的扩展包括angular language service、prettier、eslint、debugger for chrome/edge、path intellisense、gitlens和sonarlint,关键配置优化包括启用保存时自动格式…

    2026年9月23日
    500
  • win11窗口圆角效果怎么关闭_win11窗口圆角效果关闭教程

    可通过Win11DisableRoundedCorners修改系统文件实现全局直角窗口;2. 使用MicaForEveryone将圆角半径设为0以精确控制;3. 禁用硬件图形加速使系统回退至直角渲染模式;4. ExplorerPatcher可还原Win10风格并移除圆角。 如果您希望将 Window…

    2026年9月23日
    100
  • VSCode如何配置生物信息开发环境 VSCode基因组数据分析工作流

    vscode在生物信息学中的核心配置是通过安装python、r、remote-ssh/containers/wsl等扩展,结合conda管理环境,实现多语言支持与远程开发;2. 处理大规模基因组数据时应避免直接打开大文件,而是通过集成终端调用命令行工具(如samtools、bcftools)在远程服…

    2026年9月23日
    000
  • mysql如何输入注释 mysql写sql代码的格式规范

    mysql如何输入注释 mysql写sql代码的格式规范mysql如何输入注释 mysql写sql代码的格式规范mysql如何输入注释 mysql写sql代码的格式规范mysql如何输入注释 mysql写sql代码的格式规范

    在mysql中,单行注释使用–(后跟空格)或#,多行注释使用/*…*/。1. 注释应解释“为什么”而非“是什么”,单行注释推荐使用–,#常用于脚本开头;2. 多行注释适用于复杂逻辑说明或版权信息;3. sql格式规范包括关键词大写、统一缩进、合理换行与逗号放置,以…

    2026年9月23日 用户投稿
    400
  • go 语言版本控制器

    管理不同版本的go语言环境是一项繁琐的任务,尤其是当需要为每个go特性单独安装go环境时。为了简化这一过程,我们需要一个版本管理工具来统一管理go环境。以下是关于go版本控制器g的详细介绍。 一、Go版本控制器g简介 g是一个适用于Linux、macOS和Windows的命令行工具,旨在提供一个方便…

    2026年9月23日
    000
  • VSCode如何实现代码版本对比 VSCode文件差异查看的高效方法

    在vscode中快速查看当前文件与git历史版本的差异,可通过“时间线”视图点击历史提交,或在“源代码管理”视图右键提交记录选择“比较与工作区文件”实现;2. 对于任意两个本地文件的对比,可在资源管理器中右键第一个文件选择“选择以进行比较”,再右键第二个文件选择“与已选内容进行比较”,即可打开并排差…

    2026年9月23日
    100
  • Java中使用栈验证JSON字符串结构:深入理解与实践

    本文探讨了在Java中利用栈验证JSON字符串结构的核心原理与常见陷阱。我们将分析一种初始实现中处理引号、转义字符及字符串内部结构字符的不足,并提供一个更健壮的栈基方法,以准确判断JSON的括号、方括号和引号是否平衡,同时纠正关于不完整JSON片段有效性的常见误解。 1. JSON结构与验证的重要性…

    2026年9月23日
    100
  • NS2版《无主之地4》突遭延期!预购将取消

    《无主之地4》现可提前购入,使用金币叠加限时优惠券后,标准版仅需244.5元(共节省 ¥53.5);超级豪华版为457.4元(总计优惠 ¥100.6)。 原计划于10月3日发布的《无主之地4》Nintendo Switch 2版本已确认延期。Gearbox Entertainment最新发布公告称,…

    2026年9月23日
    200
  • VSCode如何实现代码版本对比 VSCode Git差异对比的高效使用方法

    vscode通过scm视图直接对比工作区与head的差异;2. 点击已暂存文件可查看暂存区与head的差异;3. 通过命令面板、scm历史记录或右键菜单可对比任意版本或文件;4. 差异视图支持并排和内联模式,并提供跳转导航;5. 时间线视图可追溯文件级提交历史并对比各版本;6. gitlens扩展增…

    2026年9月23日
    600
  • Java中基于栈验证JSON字符串结构有效性的方法

    本文探讨了在Java中利用栈(Stack)数据结构验证JSON字符串结构有效性的方法。我们将分析一个常见的基于栈的实现示例,指出其在处理字符串内部字符、引号平衡以及转义字符方面的潜在缺陷。文章将提供一个改进的解决方案,并强调此方法主要用于结构匹配,而非完整的JSON语法验证,同时建议生产环境中使用专…

    2026年9月23日
    200
  • Springboot项目引入xxl-job

    要将xxl-job集成到spring boot项目中,可以按照以下步骤进行操作: 首先,从Gitee拉取xxl-job的源码,并将其配置为Docker镜像部署到服务器上。 # 执行Maven打包mvn clean install构建Docker镜像,镜像名称中不允许使用下划线docker build…

    2026年9月23日
    100
  • Java JSON字符串有效性验证:基于栈的实现与常见陷阱

    本文深入探讨了使用Java栈结构验证JSON字符串有效性的方法。通过分析一个常见错误示例,详细阐述了在处理括号、方括号以及字符串引号时的正确逻辑,特别强调了字符串内部字符(包括转义字符)不应影响结构平衡的原则,并提供了改进思路,旨在帮助开发者构建健壮的JSON验证器。 JSON结构与栈的适用性 JS…

    2026年9月23日
    100
  • Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit虽无一键AI裁剪,但通过魔棒、智能移动等智能工具辅助选区,结合裁剪功能可高效精准裁剪;关键在于利用颜色识别与对象分离技术提升效率,避免纯手动操作,再通过调整比例、放大细节、善用撤销等功能优化结果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R…

    2026年9月23日 用户投稿
    100
  • 《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示

    《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示

    近日,《勇者斗恶龙1+2 hd-2d重制版》发布了全新预告,展示了多项新增内容,包含可探索的全新地牢、让角色掌握新技能的“卷轴系统”、经典回归的“迷你奖牌收集玩法”,以及《勇者斗恶龙2》中备受喜爱的“海底探险”机制。 最新预告视频: 《勇者斗恶龙1+2 HD-2D重制版》计划于2025年10月30日…

    2026年9月23日 用户投稿
    200

发表回复

登录后才能评论
关注微信