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

Java设计模式:工厂模式详解

引言

1. 工厂模式的定义

2. 工厂模式的类型

2.1 简单工厂模式

2.1.1 结构

2.1.2 示例代码

2.2 工厂方法模式

2.2.1 结构

2.2.2 示例代码

2.3 抽象工厂模式

2.3.1 结构

2.3.2 示例代码

3. 工厂模式的优点

4. 工厂模式的缺点

5. 实际应用场景

6. 总结


引言

工厂模式(Factory Pattern)是创建型设计模式之一,它提供了一种创建对象的最佳方式。在工厂模式中,我们不再直接通过 new 关键字来实例化对象,而是通过调用工厂方法来获取对象。这种方式将对象的创建和使用分离,提高了代码的灵活性和可维护性。

1. 工厂模式的定义

工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。

2. 工厂模式的类型

工厂模式主要有以下几种类型:

  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)
2.1 简单工厂模式

简单工厂模式不是严格意义上的设计模式,因为它并不符合开闭原则。但它提供了一个简单的对象创建机制。

2.1.1 结构
  • 产品接口(Product Interface):定义产品的公共接口。
  • 具体产品(Concrete Product):实现产品接口的具体类。
  • 工厂类(Factory Class):包含创建产品的方法,根据传入的参数返回相应的产品实例。
2.1.2 示例代码
// 产品接口
interface Shape {void draw();
}// 具体产品
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}// 工厂类
class ShapeFactory {// 根据传入的形状类型创建相应的形状对象public static Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}
}// 客户端代码
public class SimpleFactoryDemo {public static void main(String[] args) {Shape circle = ShapeFactory.getShape("CIRCLE");circle.draw();Shape rectangle = ShapeFactory.getShape("RECTANGLE");rectangle.draw();}
}
2.2 工厂方法模式

工厂方法模式定义了一个用于创建对象的接口,但由子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

2.2.1 结构
  • 产品接口(Product Interface):定义产品的公共接口。
  • 具体产品(Concrete Product):实现产品接口的具体类。
  • 工厂接口(Factory Interface):声明创建产品的方法。
  • 具体工厂(Concrete Factory):实现工厂接口,创建具体的产品实例。
2.2.2 示例代码
// 产品接口
interface Shape {void draw();
}// 具体产品
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}// 工厂接口
interface ShapeFactory {Shape createShape();
}// 具体工厂
class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}class RectangleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}// 客户端代码
public class FactoryMethodDemo {public static void main(String[] args) {ShapeFactory circleFactory = new CircleFactory();Shape circle = circleFactory.createShape();circle.draw();ShapeFactory rectangleFactory = new RectangleFactory();Shape rectangle = rectangleFactory.createShape();rectangle.draw();}
}
2.3 抽象工厂模式

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

2.3.1 结构
  • 抽象产品接口(Abstract Product Interface):定义一组产品接口。
  • 具体产品(Concrete Product):实现抽象产品接口的具体类。
  • 抽象工厂接口(Abstract Factory Interface):声明创建抽象产品的方法。
  • 具体工厂(Concrete Factory):实现抽象工厂接口,创建具体的产品实例。
2.3.2 示例代码
// 抽象产品接口
interface Shape {void draw();
}interface Color {void fill();
}// 具体产品
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}class Red implements Color {@Overridepublic void fill() {System.out.println("Filling with Red color");}
}class Green implements Color {@Overridepublic void fill() {System.out.println("Filling with Green color");}
}// 抽象工厂接口
interface AbstractFactory {Shape createShape(String shapeType);Color createColor(String colorType);
}// 具体工厂
class ShapeFactory implements AbstractFactory {@Overridepublic Shape createShape(String shapeType) {if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}@Overridepublic Color createColor(String colorType) {return null;}
}class ColorFactory implements AbstractFactory {@Overridepublic Shape createShape(String shapeType) {return null;}@Overridepublic Color createColor(String colorType) {if (colorType.equalsIgnoreCase("RED")) {return new Red();} else if (colorType.equalsIgnoreCase("GREEN")) {return new Green();}return null;}
}// 客户端代码
public class AbstractFactoryDemo {public static void main(String[] args) {AbstractFactory shapeFactory = new ShapeFactory();Shape circle = shapeFactory.createShape("CIRCLE");circle.draw();AbstractFactory colorFactory = new ColorFactory();Color red = colorFactory.createColor("RED");red.fill();}
}
3. 工厂模式的优点
  • 封装性:对象的创建过程被封装在工厂方法中,客户端不需要知道具体的创建细节。
  • 解耦:客户端与具体的产品类解耦,可以方便地更换具体的产品类。
  • 扩展性:添加新的产品类时,只需扩展工厂类即可,不需要修改现有的代码。
  • 一致性:所有对象都通过工厂方法创建,确保了创建的一致性和完整性。
4. 工厂模式的缺点
  • 增加复杂度:引入了额外的工厂类,增加了系统的复杂度。
  • 单一职责原则:工厂类可能变得非常庞大,违反了单一职责原则。
5. 实际应用场景
  • 数据库访问层:根据不同的数据库类型(如 MySQL、Oracle),创建相应的数据库连接对象。
  • 日志系统:根据不同的日志级别(如 DEBUG、INFO、ERROR),创建相应的日志记录器。
  • 图形界面:根据不同的平台(如 Windows、Linux),创建相应的 UI 控件。
6. 总结

工厂模式是一种非常实用的设计模式,它可以提高代码的可维护性和扩展性。通过将对象的创建过程封装在工厂类中,客户端可以更加灵活地使用对象,而不必关心具体的创建细节。

相关文章:

Java设计模式:工厂模式详解

引言 1. 工厂模式的定义 2. 工厂模式的类型 2.1 简单工厂模式 2.1.1 结构 2.1.2 示例代码 2.2 工厂方法模式 2.2.1 结构 2.2.2 示例代码 2.3 抽象工厂模式 2.3.1 结构 2.3.2 示例代码 3. 工厂模式的优点 4. 工厂模式的缺点 5. 实际应用场景 6. 总结 引言 工厂模…...

《Python游戏编程入门》注-第3章1

《Python游戏编程入门》的第三章是“I/O、数据和字体:Trivia游戏”,介绍了print()函数、input()函数、异常处理以及文件的输入输出,最后根据以上内容完成了Trivia游戏。 本章的“3.1 了解Trivia游戏”介绍了Trivia游戏的界面和玩法。“3.2 P…...

Java爬虫:获取数据的入门详解

在数字化时代,数据已成为最宝贵的资产之一。无论是市场研究、客户洞察还是产品开发,获取大量数据并从中提取有价值的信息变得至关重要。Java,作为一种成熟且功能强大的编程语言,为编写爬虫提供了强大的支持。Java爬虫可以帮助我们…...

GAMES104:17 游戏引擎的玩法系统:高级AI-学习笔记

文章目录 课前QA一,层次任务网络(Hierarchical Tasks Network,HTN)1.1 HTN Framework1.2 HTN Task Types1.2.1 Primitive Task基本任务1.2.2 Compound Task符合任务 1.3 Planning1.4 Replan1.5 总结 二,目标导向行为规…...

【Unity】Unity中获取网络时间进行每日和每月刷新

直接上代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DateChecker : MonoBehaviour {private DateTime lastCheckedDate; //上次刷新日数据的日期private DateTime lastMonthUtc; //上次刷新月数据的日期T…...

微信小程序上传组件封装uploadHelper2.0使用整理

一、uploadHelper2.0使用步骤说明 uploadHelper.js ---上传代码封装库 cos-wx-sdk-v5.min.js---腾讯云,对象存储封装库 第一步,下载组件代码,放置到自己的小程序项目中 第二步、 创建上传对象,执行选择图片/视频 var _this th…...

力扣每日打卡挑战 3184. 构成整天的下标对数目 I

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…...

The First:Starknet如何让以太坊更快更安全?

随着区块链技术需求的持续增长&#xff0c;当前技术在可扩展性和隐私保护方面的局限性愈发凸显&#xff0c;以太坊网络便是其中的典型代表。为有效应对这些挑战&#xff0c;第二层扩展解决方案的重要性日益凸显。这些方案旨在将部分交易处理转移至以太坊主链之外&#xff0c;以…...

【计算机网络 - 基础问题】每日 3 题(五十三)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…...

便携式移动消防炮:灵活灭火新选择

在当今快速发展的社会中&#xff0c;火灾安全问题一直是公众安全的重要组成部分。无论是家庭、办公场所还是大型工业区&#xff0c;火灾的发生都可能带来不可预测的巨大损失&#xff0c;传统消防固定系统往往无法迅速适应多变的火场环境&#xff0c;特别是对于那些发生在高层建…...

18.VScode写Java项目的教程

VScode写Java项目的教程 1.首先必选先安装Java解释器2.安装插件Java Extension Pack3.创建项目创建项目结构选择项目类型 4.测试结果源码内容 今天用一台老式笔记本写代码&#xff0c;IDEA跑不动就准备用VScode突然间就蒙了&#xff0c;怎么创建项目啊&#xff1f;于是就有了这…...

本地生活便民信息服务小程序源码系统 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程

系统概述 地方门户分类信息网站源码系统是一个基于PHP和MySQL开发的强大平台&#xff0c;旨在帮助用户轻松搭建地方性的分类信息网站。该系统集成了众多实用功能&#xff0c;支持用户自由发帖、浏览和搜索各类信息&#xff0c;如二手交易、求职招聘、房屋租售、生活服务、商家…...

Java项目实战II基于微信小程序的原创音乐平台{UNIAPP+SSM+MySQL+Vue}(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字音乐…...

【个人同步与备份】电脑(Windows)与手机/平板(Android)之间文件同步

文章目录 1. syncthing软件下载2. syncthing的使用2.1. 添加设备2.1.1. syncthing具备设备发现功能&#xff0c;因此安装好软件&#xff0c;只需确认设备信息是否对应即可2.1.2. 如果没有发现到&#xff0c;可以通过设备ID连接2.1.3. 设置GUI身份验证用户&#xff0c;让无关设备…...

代码随想录算法训练营第46期Day37,38,39,41

这几天晚上看比赛&#xff0c;就把刷题耽误了。还好是开新章节&#xff0c;前面的题都比较简单。 然后周天做完了又忘记发了 动态规划 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数 Day37前两道题太简单…...

点跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换

点目标跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换 读论文RAFT密集光流跟踪的笔记 RAFT是一种新的光流深度网络结构&#xff0c;由于需要基于点去做目标的跟踪&#xff0c;因此也是阅读了像素级别跟踪的一篇ECCV 2020的经典…...

jmeter学习(6)逻辑控制器-循环

循环执行 1、循环读取csv文件的值 2、foreach 读取变量&#xff0c;变量数字后缀有序递增&#xff0c;通过counter实现 ${__V(typeId${typeIdNum})} beansell断言 String typeIdNum vars.get("typeIdNum"); String response prev.getResponseDataAsString(); …...

unity学习笔记-安装与部署

unity学习笔记-安装与部署 unity & visual studio下载unityvisual studio 创建工程项目内的布局介绍初始化项目各目录介绍1. 场景视图&#xff08;Scene&#xff09;2. 游戏视图&#xff08;Game&#xff09;3. 层次结构视图&#xff08;Hierarchy&#xff09;4. 检查器视图…...

Django+MySQL接口开发完全指南

前言 本文将详细介绍如何使用Django结合MySQL数据库开发RESTful API接口。我们将从环境搭建开始&#xff0c;一步步实现一个完整的接口项目。 环境准备 首先需要安装以下组件&#xff1a; Python 3.8Django 4.2MySQL 8.0mysqlclientdjangorestframework 安装命令 # 创建虚…...

CentOS7上下载安装 Docker Compose

Docker Compose简要介绍&#xff08;想直接看安装步骤的请跳转到[必要的安装步骤]&#xff09; Docker Compose 是一个用于定义和管理多容器 Docker 应用的工具&#xff0c;它可以通过一个简单的 YAML 文件&#xff08;docker-compose.yml&#xff09;来配置应用程序的服务、网…...

AlphaFold 3终极指南:掌握Jackhmmer与HMMER提升蛋白质结构预测精度

AlphaFold 3终极指南&#xff1a;掌握Jackhmmer与HMMER提升蛋白质结构预测精度 【免费下载链接】alphafold3 AlphaFold 3 inference pipeline. 项目地址: https://gitcode.com/gh_mirrors/alp/alphafold3 你是否在蛋白质结构预测项目中遇到MSA生成效率低下的瓶颈&#x…...

作业本耐用度差距巨大?深圳大明印刷厂拆解合规工艺,告别定制作业本掉页开裂通病

在校园日常教学中&#xff0c;很多学校都会遇到同一个难题&#xff1a;同一学期采购的作业本、定制作业本&#xff0c;品质差距悬殊&#xff0c;有的完好无损用到期末&#xff0c;有的短短几周就出现书脊开裂、页面脱落、边角破损、翻页卡顿等问题。不少人误以为是学生使用习惯…...

本地柴油发电机组排行2023年最新榜单

柴油发电机是通过燃烧柴油驱动发动机&#xff0c;进而发电的设备&#xff0c;广泛应用于电力中断或无电网地区。1. 柴油发电机的核心工作原理是什么&#xff1f;柴油发电机是一种将化学能转化为电能的设备&#xff0c;其核心是柴油发动机与交流发电机的组合。当柴油在发动机内燃…...

半导体元件(二极管/三极管/MOS管/IC)损坏诊断全解

半导体元件&#xff08;二极管、三极管、MOS 管、集成电路&#xff09;是 PCB 的核心功能单元&#xff0c;对过压、过流、ESD、高温极度敏感&#xff0c;损坏后直接导致电路功能失效、短路烧板。很多工程师维修时盲目更换芯片&#xff0c;不仅成本高&#xff0c;还易误判。​一…...

Vue2-Verify:解决前端验证码安全性与用户体验平衡问题的技术方案实现

Vue2-Verify&#xff1a;解决前端验证码安全性与用户体验平衡问题的技术方案实现 【免费下载链接】vue2-verify vue的验证码插件 项目地址: https://gitcode.com/gh_mirrors/vu/vue2-verify 在当今Web应用开发中&#xff0c;验证码作为防止自动化攻击的关键安全组件&…...

LoRa物联网与动态基线算法在养殖体温监测中的实战应用

1. 项目概述&#xff1a;为什么我们需要一个智能体温监测系统&#xff1f;在规模化养殖场里干了十几年&#xff0c;我见过太多因为体温异常没被及时发现而导致的损失。一头育肥猪突然不吃食&#xff0c;等饲养员第二天巡栏发现时&#xff0c;可能已经高烧好几天&#xff0c;继发…...

Python strip 与 rstrip 函数区别

Python strip 与 rstrip 函数区别 文章目录Python strip 与 rstrip 函数区别一、核心作用二、基础语法三、基础使用示例四、指定删除特定字符五、常用业务场景一、核心作用 函数作用范围strip()移除字符串首尾空白字符rstrip()仅移除字符串右侧末尾字符&#xff0c;左侧保持不…...

全方位梳理 OpenClaw 部署与使用干货

OpenClaw 一键安装包&#xff5c;可视化部署&#xff0c;简化环境配置流程 ✨适配系统&#xff1a;Windows10/11 64 位 当前版本&#xff1a;v2.7.5&#xff08;虾壳云版&#xff09; ✨核心优势&#xff1a;全程可视化操作&#xff0c;不用命令行、不用手动配置 Python/Node…...

Claude Mythos Preview首月揪万余漏洞、拦截150万美元电诈,网络安全格局将变?

玻璃翼计划首战告捷A厂的玻璃翼计划首战告捷&#xff0c;Mythos 30天内就挖出1万个致命漏洞&#xff0c;甚至拦截了150万美元电诈。面对雪片式的报告&#xff0c;人类程序员崩溃求饶&#xff1a;「求别挖了&#xff0c;根本修不完啊&#xff01;」就在刚刚&#xff0c;Anthropi…...

抖音批量下载工具:高效获取用户主页全作品的专业解决方案

抖音批量下载工具&#xff1a;高效获取用户主页全作品的专业解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...