news 2026/6/11 16:34:51

工厂设计模式(菜鸟教程)--高频面试问题系列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工厂设计模式(菜鸟教程)--高频面试问题系列

作者有话要说

本文以奶茶为例,深入浅出地讲解工厂设计模式的三种分类,帮助读者轻松掌握这一概念。

一,什么是工厂设计模式

定义一个创建对象的接口,由子类决定实例化哪个类,将对象的创建延迟到子类。

例如:

如果没有奶茶店(工厂设计模式),你想喝珍珠奶茶就需要准备珍珠,牛奶等,还需要自己配方。如果你又想喝芋泥奶茶,你就又需要准备芋泥,还需要调整配方。

但是如果有了奶茶店(工厂设计模式),你想喝珍珠奶茶只需要给店员说一声就可以喝到,想喝芋泥奶茶也只需要说一声。而且奶茶店还可以拓展更多新品种的奶茶供你选择。

二,工厂设计模式的特点

核心:对象创建过程在子类中实现。

三,什么时候使用工厂设计模式

1.对象常见逻辑复杂,调用者无需关注细节。

  • 如果new一个对象需要写5行以上的代码,就可以考虑使用工厂设计模式

2.需要支持多种产品类型,且可能频繁扩展。

  • 存在支付宝支付,微信支付等多种支付方式,现在发明了银联支付可以直接支付。

3.需要统一管控对象的创建过程。

  • 创建日志记录,在工厂中记录每个对象的创建时间,创建者。

4.需要创建一组配套的,相关的产品。

  • 奶茶套餐,家具设计等。

四,工厂设计模式的代码解析

工厂设计模式可以分为三种类型,接下来就三种类型的代码进行解析

1.简单工厂模式(一个工厂生产不同的奶茶)

核心:定义一个工厂类,通过静态方法根据传入的参数,创建不同类型的产品对象。

适用场景:产品种类较少、变化不频繁的场景。

代码:

第一步:定义产品接口

// 第一步:定义产品接口(所有奶茶的共同行为) interface MilkTea { void make(); // 制作奶茶的方法 }

第二步:实现具体产品类

// 珍珠奶茶类 class PearlMilkTea implements MilkTea { @Override public void make() { System.out.println("制作珍珠奶茶:煮茶底+加珍珠+调甜度"); } } //芋泥奶茶类 class TaroMilkTea implements MilkTea { @Override public void make() { System.out.println("制作芋泥奶茶:煮茶底+加芋泥+调甜度"); } }

第三步:定义简单工厂类(核心:统一创建产品)

class MilkTeaFactory { // 静态工厂方法:根据参数返回不同的奶茶对象 public static MilkTea createMilkTea(String type) { if ("pearl".equals(type)) { return new PearlMilkTea(); } else if ("taro".equals(type)) { return new TaroMilkTea(); } else { throw new IllegalArgumentException("本店不卖,你可以去蜜雪冰城看看"); } } }

第四步:测试一下

// 测试:调用者只需要传参数,不用关心创建过程 public class SimpleFactoryTest { public static void main(String[] args) { // 要珍珠奶茶 MilkTea pearlTea = MilkTeaFactory.createMilkTea("pearl"); pearlTea.make(); // 要芋泥奶茶 MilkTea taroTea = MilkTeaFactory.createMilkTea("taro"); taroTea.make(); } }

2.工厂模式(不同的工厂生产不同的奶茶)

核心:将工厂抽象成接口 / 抽象类,每个具体产品对应一个具体工厂类,由具体工厂创建对应的产品。

适用场景:产品种类较多、需要频繁扩展的场景。

代码:

第一步:定义产品接口。

// 第一步:定义产品接口(和简单工厂一致) interface MilkTea { void make(); }

第二步:实现具体产品类。

// 第二步:实现具体产品类(和简单工厂一致) class PearlMilkTea implements MilkTea { @Override public void make() { System.out.println("制作珍珠奶茶"); } } class TaroMilkTea implements MilkTea { @Override public void make() { System.out.println("制作芋泥奶茶"); } }

第三步:定义工厂接口。

// 第三步:定义工厂接口(抽象工厂) interface MilkTeaFactory { MilkTea createMilkTea(); // 工厂方法:创建产品 }

第四步:实现具体工厂类(每个产品对应一个工厂)。

// 第四步:实现具体工厂类(每个产品对应一个工厂) class PearlMilkTeaFactory implements MilkTeaFactory { @Override public MilkTea createMilkTea() { return new PearlMilkTea(); } } class TaroMilkTeaFactory implements MilkTeaFactory { @Override public MilkTea createMilkTea() { return new TaroMilkTea(); } }

第五步:测试一下,调用者通过具体工厂获取产品。

// 测试:调用者通过具体工厂获取产品 public class FactoryMethodTest { public static void main(String[] args) { // 要珍珠奶茶:创建珍珠奶茶工厂,再生产产品 MilkTeaFactory pearlFactory = new PearlMilkTeaFactory(); MilkTea pearlTea = pearlFactory.createMilkTea(); pearlTea.make(); // 要芋泥奶茶:创建芋泥奶茶工厂,再生产产品 MilkTeaFactory taroFactory = new TaroMilkTeaFactory(); MilkTea taroTea = taroFactory.createMilkTea(); taroTea.make(); } }

3.抽象工厂模式(一个工厂生产一组奶茶族:奶茶+小料)

核心:工厂不仅能创建一种产品,还能创建一组相关联、配套的产品(比如奶茶工厂不仅造奶茶,还能造配套的小料;汽车工厂不仅造汽车,还能造汽车轮胎、座椅)。

适用场景:需要创建一组配套产品的场景,比如系统的界面组件(Windows 风格的按钮 + 文本框、Mac 风格的按钮 + 文本框)。

代码:

第一步:定义一组产品接口(奶茶)

// 第一步:定义第一组产品接口(奶茶) interface MilkTea { void make(); } // 实现具体奶茶产品 class PearlMilkTea implements MilkTea { @Override public void make() { System.out.println("制作珍珠奶茶"); } } class TaroMilkTea implements MilkTea { @Override public void make() { System.out.println("制作芋泥奶茶"); } }

第二步:定义第二组产品接口(小料)

// 第二步:定义第二组产品接口(小料) interface Topping { void add(); } // 实现具体小料产品 class PearlTopping implements Topping { @Override public void add() { System.out.println("添加珍珠小料"); } } class TaroTopping implements Topping { @Override public void add() { System.out.println("添加芋泥小料"); } }

第三步:定义抽象工厂接口(能创建奶茶+小料一组产品)

// 第三步:定义抽象工厂接口(能创建奶茶+小料一组产品) interface MilkTeaSystemFactory { MilkTea createMilkTea(); // 创建奶茶 Topping createTopping(); // 创建配套小料 }

第四步:实现具体工厂(珍珠奶茶+珍珠小料工厂)

// 第四步:实现具体工厂(珍珠奶茶+珍珠小料工厂) class PearlMilkTeaSystemFactory implements MilkTeaSystemFactory { @Override public MilkTea createMilkTea() { return new PearlMilkTea(); } @Override public Topping createTopping() { return new PearlTopping(); } } // 芋泥奶茶+芋泥小料工厂 class TaroMilkTeaSystemFactory implements MilkTeaSystemFactory { @Override public MilkTea createMilkTea() { return new TaroMilkTea(); } @Override public Topping createTopping() { return new TaroTopping(); } }

第五步:测试一下,创建一组配套产品

// 测试:创建一组配套产品 public class AbstractFactoryTest { public static void main(String[] args) { // 珍珠奶茶套餐:珍珠奶茶+珍珠小料 MilkTeaSystemFactory pearlFactory = new PearlMilkTeaSystemFactory(); MilkTea pearlTea = pearlFactory.createMilkTea(); Topping pearlTopping = pearlFactory.createTopping(); pearlTea.make(); pearlTopping.add(); // 芋泥奶茶套餐:芋泥奶茶+芋泥小料 MilkTeaSystemFactory taroFactory = new TaroMilkTeaSystemFactory(); MilkTea taroTea = taroFactory.createMilkTea(); Topping taroTopping = taroFactory.createTopping(); taroTea.make(); taroTopping.add(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 17:49:55

2025年GEO服务商选择指南:AI搜索优化综合服务商与垂直专家全解析

随着生成式AI技术的快速发展,尤其是ChatGPT、DeepSeek等AI平台的普及,AI已不再是单纯的搜索引擎工具,它已经成为了用户做出购买决策、选择产品或服务的核心驱动力。AI搜索优化(GEO优化)作为新兴的优化手段,…

作者头像 李华
网站建设 2026/6/11 1:05:57

打破认知牢笼:合规新纪元,运营成本如何变身增长引擎?

跨境电商领域正经历一场静默而深刻的变革:合规,这个曾被视为束缚增长的成本中心,正在演变为驱动商业成功的战略引擎,随着全球监管框架的日益精密与统一,领先的平台与敏锐的卖家正共同推动一场认知革命——将合规内化为…

作者头像 李华
网站建设 2026/6/11 0:28:37

Nginx access 日志通过 Filebeat 8.15.5 写入 Elasticsearch 8 实战指南

Nginx access 日志通过 Filebeat 8.15.5 写入 Elasticsearch 8 实战指南一、环境说明二、部署步骤与深度解析步骤1:创建Filebeat工作目录步骤 2:下载并解压 Filebeat 安装包​步骤 3:filebeat.yml 核心配置文件​输入配置 (filebeat.inputs)模…

作者头像 李华
网站建设 2026/6/10 2:01:40

Springboot萌宠商城网站6ul9k(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能:用户,商家,入驻申请,洗护医疗,广告申请,商品分类,商品信息,用户预约,宠物分类,宠物救助,领养信息,用户捐款开题报告内容基于Spring Boot的萌宠商城网站开题报告一、选题背景与意义1.1 选题背景随着人们生活水平的提高和宠物文化的普及&…

作者头像 李华
网站建设 2026/6/11 10:41:12

Springboot萌宠网网站r11uf(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能:用户,商家,宠物种类,宠物信息,宠物资讯开题报告内容基于Spring Boot的萌宠网网站开题报告一、选题背景与意义1.1 选题背景随着城市化进程的加速和居民生活水平的提升,宠物已成为现代家庭的重要情感寄托。据《2025年中国宠物行业…

作者头像 李华
网站建设 2026/6/11 9:26:57

Windows找不到d3dcompiler_43.dll文件 如何下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华