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

Java设计模式之《工厂模式》

目录

1、介绍

1.1、定义

1.2、优缺点

1.3、使用场景

2、实现

2.1、简单工厂模式

2.2、工厂方法模式

2.3、抽象工厂模式

3、小结


前言

        在面向对象编程中,创建对象实例最常用的方式就是通过 new 操作符构造一个对象实例,但在某些情况下,new 操作符直接生成对象会存在一些问题。

举例来说,对象的创建需要一系列的步骤:

        可能需要计算或取得对象的初始位置、选择生成哪个子对象实例、或在生成之前必须先生成一些辅助对象。

         在这些情况,新对象的建立就是一个 “过程”,而不仅仅是一个操作,就像一部大机器中的一个齿轮传动。

        工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需指定具体的实现类。

Java设计模式分类,如下所示:


1、介绍

1.1、定义

         工厂模式将目的将创建对象的具体过程屏蔽隔离起来,从而达到更高的灵活性。

如下所示:

工厂模式可以分为三类:

  1. 简单工厂模式(Simple Factory)
  2. 工厂方法模式(Factory Method)
  3. 抽象工厂模式(Abstract Factory)

1、在没有工厂的时代:

如果客户需要一款宝马车,那么就需要客户去创建一款宝马车,然后拿来用。

2、简单工厂模式:

        后来出现了工厂,用户不再需要去创建宝马车,由工厂进行创建,想要什么车,直接通过工厂创建就可以了。比如想要320i系列车,工厂就创建这个系列的车。

3、工厂方法模式:

        为了满足客户,宝马车系列越来越多,如320i、523i等等系列,一个工厂无法创建所有的宝马系列,于是又单独分出来多个具体的工厂,每个具体工厂创建一种系列,即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象,你需要指定某个具体的工厂才能生产车出来。

4、抽象工厂模式:

        随着客户要求越来越高,宝马车必须配置空调,于是这个工厂开始生产宝马车和需要的空调。最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车。

1.2、优缺点

  • 将对象的创建与使用分离。

  • 降低系统的耦合度。

  • 便于扩展新的产类型。

1.3、使用场景

  1. 如果只是创建单个对象的不同实现(如不同的数据库连接),用工厂方法。

  2. 如果需要创建配套的一组对象(如不同操作系统的UI组件套件),用抽象工厂


2、实现

2.1、简单工厂模式

// 产品接口
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 简单工厂
class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}throw new IllegalArgumentException("Unknown product type");}
}// 使用示例
public class Main {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use();  // 输出: Using Product AProduct productB = SimpleFactory.createProduct("B");productB.use();  // 输出: Using Product B}
}

2.2、工厂方法模式

相比较于抽象工厂模式,可以对接口的实现纵向扩展。

// 产品接口
interface Engine {void start();
}// 具体产品
class ElectricEngine implements Engine {public void start() { System.out.println("电动机启动"); }
}class FuelEngine implements Engine {public void start() { System.out.println("燃油发动机启动"); }
}// 工厂接口(只生产发动机)
interface EngineFactory {Engine createEngine();
}// 具体工厂
class ElectricEngineFactory implements EngineFactory {public Engine createEngine() { return new ElectricEngine(); }
}class FuelEngineFactory implements EngineFactory {public Engine createEngine() { return new FuelEngine(); }
}// 使用示例
public class Main {public static void main(String[] args) {EngineFactory ef = new ElectricEngineFactory();Engine engine = ef.createEngine();engine.start(); // 输出: 电动机启动}
}

特点

  • 只生产发动机这一种产品

  • 如果要新增空调组件,需要另写一套空调工厂

2.3、抽象工厂模式

相比于工厂方法模式,抽象工厂模式,可以横向扩展。

// 产品族接口
interface Engine {void start();
}interface AirConditioner {void cool();
}// 电动系列产品
class ElectricEngine implements Engine {public void start() { System.out.println("电动机启动"); }
}class ElectricAirConditioner implements AirConditioner {public void cool() { System.out.println("电子变频空调工作"); }
}// 燃油系列产品
class FuelEngine implements Engine {public void start() { System.out.println("燃油发动机启动"); }
}class FuelAirConditioner implements AirConditioner {public void cool() { System.out.println("机械压缩机空调工作"); }
}// 抽象工厂接口(能生产整套组件)
interface CarFactory {Engine createEngine();AirConditioner createAirConditioner();
}// 具体工厂
class ElectricCarFactory implements CarFactory {public Engine createEngine() { return new ElectricEngine(); }public AirConditioner createAirConditioner() { return new ElectricAirConditioner(); }
}class FuelCarFactory implements CarFactory {public Engine createEngine() { return new FuelEngine(); }public AirConditioner createAirConditioner() { return new FuelAirConditioner(); }
}// 使用示例
public class Main {public static void main(String[] args) {CarFactory cf = new ElectricCarFactory();Engine engine = cf.createEngine();AirConditioner ac = cf.createAirConditioner();engine.start();  // 输出: 电动机启动ac.cool();      // 输出: 电子变频空调工作}
}

特点

  • 一个工厂能生产配套的发动机+空调

  • 保证电动车的发动机和空调是电子化的,燃油车的都是机械化的


3、小结

1、简单工厂模式

一个工厂类根据传入的参数决定创建哪种产品类的实例。

2、工厂方法模式

定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。

3、抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。


参考文章:

1、Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)_简单工厂模式,工厂方法模式,抽象工厂模式-CSDN博客https://blog.csdn.net/a745233700/article/details/120253639?ops_request_misc=%257B%2522request%255Fid%2522%253A%252227ffb8b4a369e0e5024f4e17abda46f3%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=27ffb8b4a369e0e5024f4e17abda46f3&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-120253639-null-null.142^v102^pc_search_result_base1&utm_term=%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187

http://www.xdnf.cn/news/1310671.html

相关文章:

  • 【Java web】HTTP 协议详解
  • HTTP 1.0, 2.0 和 3.0 有什么区别?
  • OpenAI TTS API + Web 前端 AudioContext 实战方案
  • (论文速读)ViDAR:视觉自动驾驶预训练框架
  • leetcode-139. 单词拆分-C
  • 中本聪思想与Web3的困境:从理论到现实的跨越
  • 从依赖到自研:一个客服系统NLP能力的跃迁之路
  • 昇腾AI自学Day2-- 深度学习基础工具与数学
  • Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
  • 异构数据库兼容力测评:KingbaseES 与 MySQL 的语法・功能・性能全场景验证解析
  • linux设备驱动之字符设备驱动
  • Python代码规范与静态检查(ruff/black/mypy + pyproject.toml + Makefile)自动化工具链介绍
  • 【LeetCode 热题 100】70. 爬楼梯——(解法二)自底向上
  • 在鸿蒙应用中快速接入地图功能:从配置到实战案例全解析
  • ISO27001 高阶架构 之 支持 -2
  • PHP域名授权系统网站源码/授权管理工单系统/精美UI/附教程
  • 广东省省考备考(第七十八天8.16)——资料分析、判断推理(强化训练)
  • Spring AMQP如何通过配置文件避免硬编码实现解耦
  • Linux -- 文件【下】
  • 深度解析和鲸社区热门项目:电商双 11 美妆数据分析的细节与价值
  • 41 C++ STL模板库10-容器3-list
  • 正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
  • docker-compose-mysql-定时备份数据库到其他服务器脚本
  • 【机器学习深度学习】OpenCompass:支持的开源评估数据集及使用差异
  • RemoteCtrl-初步的网络编程框架搭建
  • 安全审计-firewall防火墙
  • 算法训练营day52 图论③ 101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
  • 基于Uni-app+vue3实现微信小程序地图固定中心点范围内拖拽选择位置功能(分步骤详解)
  • MySQL 配置性能优化赛技术文章
  • 基于Python3.10.6与jieba库的中文分词模型接口在Windows Server 2022上的实现与部署教程