news 2026/6/13 20:14:06

23种设计模式之工厂模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
23种设计模式之工厂模式

工厂模式属于创建型设计模式,核心思想:封装对象创建逻辑,统一生产对象,隔离对象创建与使用。

工厂模式分三大类

  1. 简单工厂(静态工厂)

    1 个工厂 + N 个产品,工厂依赖抽象产品
  2. 工厂方法

    N 个工厂 + N 个产品,1 个工厂对应 1 个产品
  3. 抽象工厂

    N 个工厂 + 多组产品(产品族),1 个工厂对应一整套产品

一、简单工厂模式(Simple Factory)

1. 定义

一个工厂类负责创建所有产品实例,根据传入参数决定创建哪一个对象。不属于 GoF 23 种标准设计模式

2. 角色

  • 抽象产品:产品统一接口/父类

  • 具体产品:接口实现类

  • 工厂类:核心,包含创建对象逻辑

3. 适用场景

产品种类少、创建逻辑简单,客户端只需传入标识就能获取对象。

4. 代码和UMl类图

// 1. 抽象产品 public interface Fruit { void eat(); } // 2. 具体产品 class Apple implements Fruit { @Override public void eat() { System.out.println("吃苹果"); } } class Banana implements Fruit { @Override public void eat() { System.out.println("吃香蕉"); } } // 3. 工厂类 class FruitFactory { // 静态方法:简单工厂核心 public static Fruit createFruit(String type) { if ("apple".equals(type)) { return new Apple(); } else if ("banana".equals(type)) { return new Banana(); } return null; } } // 客户端 public class Client { public static void main(String[] args) { Fruit apple = FruitFactory.createFruit("apple"); apple.eat(); } }

5. 优缺点

  • 优点:创建逻辑集中,客户端不用new对象

  • 缺点:违背开闭原则,新增产品必须修改工厂代码;产品多时代码臃肿


二、工厂方法模式(Factory Method)⭐ 标准23种模式之一

1. 定义

一个产品对应一个工厂,定义抽象工厂接口,让具体工厂创建对应具体产品。

完全遵循开闭原则:新增产品只需要新增对应工厂,不修改原有代码。

2. 角色

  • 抽象产品

  • 具体产品

  • 抽象工厂:定义创建产品的抽象方法

  • 具体工厂:实现抽象工厂,生产对应产品

3. 适用场景

产品种类较多,且频繁新增产品,需要严格遵守开闭原则。

4. 代码和uml类型图

// 1. 抽象产品 public interface Fruit { void eat(); } // 具体产品 class Apple implements Fruit { @Override public void eat() { System.out.println("吃苹果"); } } class Banana implements Fruit { @Override public void eat() { System.out.println("吃香蕉"); } } // 2. 抽象工厂 public interface FruitFactory { Fruit createFruit(); } // 3. 具体工厂 class AppleFactory implements FruitFactory { @Override public Fruit createFruit() { return new Apple(); } } class BananaFactory implements FruitFactory { @Override public Fruit createFruit() { return new Banana(); } } // 客户端 public class Client { public static void main(String[] args) { FruitFactory factory = new AppleFactory(); Fruit fruit = factory.createFruit(); fruit.eat(); } }

5. 优缺点

  • 优点:遵守开闭原则;单一职责,一个工厂只生产一种产品

  • 缺点:类数量爆炸,每加一个产品就要加一个工厂类


三、抽象工厂模式(Abstract Factory)⭐ 标准23种模式之一

1. 定义

工厂生产「产品族」,而非单个产品。

  • 产品族:一组相关/配套的产品(如:手机 + 耳机 一套数码产品)

  • 产品等级:同类型不同品牌(如:小米手机、华为手机)

2. 核心区别(对比工厂方法)

  • 工厂方法:一个工厂只生产一类产品(单一产品)

  • 抽象工厂:一个工厂生产一整套产品(产品族)

3. 角色

  • 抽象产品(多个:产品A、产品B)

  • 具体产品

  • 抽象工厂:定义多个创建方法,对应不同产品

  • 具体工厂:实现整套产品的创建

4. 适用场景

系统存在多组配套产品,产品之间有约束、必须搭配使用。

5. 代码(Java)和uml类图

场景:数码产品族(手机、耳机),两个品牌:小米、华为

// ===== 抽象产品 ===== // 手机抽象 public interface Phone { void call(); } // 耳机抽象 public interface Headset { void listen(); } ​ // ===== 具体产品 ===== // 小米产品 class XiaomiPhone implements Phone { @Override public void call() { System.out.println("小米手机通话"); } } class XiaomiHeadset implements Headset { @Override public void listen() { System.out.println("小米耳机听歌"); } } // 华为产品 class HuaweiPhone implements Phone { @Override public void call() { System.out.println("华为手机通话"); } } class HuaweiHeadset implements Headset { @Override public void listen() { System.out.println("华为耳机听歌"); } } ​ // ===== 抽象工厂(生产整套产品) ===== public interface DigitalFactory { Phone createPhone(); Headset createHeadset(); } ​ // ===== 具体工厂(品牌工厂,生产整个产品族) ===== class XiaomiFactory implements DigitalFactory { @Override public Phone createPhone() { return new XiaomiPhone(); } @Override public Headset createHeadset() { return new XiaomiHeadset(); } } class HuaweiFactory implements DigitalFactory { @Override public Phone createPhone() { return new HuaweiPhone(); } @Override public Headset createHeadset() { return new HuaweiHeadset(); } } ​ // 客户端 public class Client { public static void main(String[] args) { DigitalFactory factory = new XiaomiFactory(); Phone phone = factory.createPhone(); Headset headset = factory.createHeadset(); phone.call(); headset.listen(); } }

6. 优缺点

  • 优点:保证产品族配套使用;新增品牌工厂方便(苹果工厂),符合开闭

  • 缺点:新增产品等级非常麻烦(比如新增「手表」,所有工厂都要改)


四、三种工厂模式对比总结

模式特点开闭原则适用场景
简单工厂单工厂、多产品,靠参数判断不满足产品固定、很少新增
工厂方法一产品对应一工厂满足单一产品类型,频繁加产品
抽象工厂工厂生产整套产品族产品族扩展友好,产品等级扩展困难多组配套产品

五、实际开发使用建议

  1. 简单工厂:日常快速开发、工具类、内部组件最常用

  2. 工厂方法:框架、开源组件、需要持续迭代扩展的模块

  3. 抽象工厂:电商多产品线、软硬件配套、跨平台多组件场景

六、常见面试考点

  1. 工厂模式的作用:解耦对象创建与使用、统一管理实例、屏蔽创建细节

  2. 简单工厂为什么不算标准23种设计模式?破坏开闭原则

  3. 工厂方法 vs 抽象工厂:单一产品vs产品族

  4. 开闭原则在三种模式中的体现

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 4:13:28

uni-app跨平台开发实战:一套代码,发布6平台

一、为什么选择uni-app? 在移动互联网时代,一个产品往往需要同时覆盖Android、iOS、H5、以及微信/支付宝/百度等多个小程序平台。传统开发模式下,每个平台都需要独立开发团队,成本高、周期长、维护难。 uni-app 是DCloud公司基于…

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

【数据安全】数据安全风险评估及安全建设架构体系全景方案:基于DSMM框架,围绕数据安全管理、技术、活动及个人信息保护

本方案基于DSMM框架,围绕数据安全管理、技术、活动及个人信息保护,系统阐述了数据安全风险评估的五阶段流程(准备、调研、评估、整改、报告),并构建了“业务-IT-安全”三元融合的安全建设架构,确保企业数据…

作者头像 李华
网站建设 2026/6/12 19:49:56

男人日常轻滋养,一杯吴麓山堂滴鸡精就够

跟各位在外打拼的男性老哥,说几句掏心窝的心里话。人到中年,一边扛起家庭,一边稳住职场,身上担子越来越重,日积月累的疲惫,真的藏不住。我今年39岁,在公司做部门管理,每天早七出门、…

作者头像 李华
网站建设 2026/6/12 6:51:23

大模型推理加速实践:从 KV Cache 到量化部署的工程优化思路

大模型应用真正进入生产环境后,团队很快会遇到一个很现实的问题:模型能跑起来,不代表能稳定、低成本、高并发地跑起来。在 Demo 阶段,我们可能只关心模型回答是否准确;但一旦面向真实用户,就必须考虑&#…

作者头像 李华
网站建设 2026/6/13 14:26:26

车间夏季闷热无解?易互德布风管全域送风告别局部高温

每到夏季高温时段,大量工业厂房普遍出现“空调开足依旧闷热”的问题。很多企业空调机组功率充足、设备正常运行,但车间依旧局部高温、死角闷热、人员体感差异大,员工中暑、作业效率下降、产品良品率降低,成为夏季生产的普遍难题。…

作者头像 李华