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

java设计模式:工厂方法

工厂方法模式是一种广泛使用的创建型设计模式,它的核心思想是将对象的实例化过程推迟到子类中,从而使代码更加灵活和符合开闭原则。
下面用一个清晰的对比表格来展示工厂方法模式的核心角色及其职责,帮助你快速把握其结构。
角色名称
职责描述
​​抽象产品​​
定义产品的通用接口。

​​具体产品​​
实现抽象产品接口,是工厂方法要创建的具体对象。

​​抽象工厂​​
声明工厂方法,该方法返回一个抽象产品类型的对象。

​​具体工厂​​
实现抽象工厂的工厂方法,负责实例化特定的具体产品对象

💻 代码示例:日志记录器
假设我们需要一个日志系统,可以灵活地选择将日志记录到文件或数据库中。
首先,定义抽象产品 Logger接口和两个具体产品 FileLogger、DatabaseLogger:

// 抽象产品:日志记录器接口
public interface Logger {void log(String message);
}// 具体产品:文件日志记录器
public class FileLogger implements Logger {@Overridepublic void log(String message) {System.out.println("记录到文件:" + message);}
}// 具体产品:数据库日志记录器
public class DatabaseLogger implements Logger {@Overridepublic void log(String message) {System.out.println("记录到数据库:" + message);}
}

接着,定义抽象工厂 LoggerFactory和两个具体工厂 FileLoggerFactory、DatabaseLoggerFactory:

// 抽象工厂
public interface LoggerFactory {Logger createLogger(); // 工厂方法
}// 具体工厂:创建文件日志记录器
public class FileLoggerFactory implements LoggerFactory {@Overridepublic Logger createLogger() {// 这里可能包含复杂的初始化逻辑return new FileLogger();}
}// 具体工厂:创建数据库日志记录器
public class DatabaseLoggerFactory implements LoggerFactory {@Overridepublic Logger createLogger() {// 例如,需要先获取数据库连接等return new DatabaseLogger();}
}

最后,在客户端代码中,通过选择不同的具体工厂来获得不同的产品:

public class Main {public static void main(String[] args) {// 根据需要配置或切换工厂LoggerFactory factory = new FileLoggerFactory();// LoggerFactory factory = new DatabaseLoggerFactory(); // 切换时只需修改这一行Logger logger = factory.createLogger();logger.log("这是一条日志信息");}
}

✅ 模式优势
工厂方法模式的主要优点包括:
​​良好的扩展性​​:当需要增加新的产品(如网络日志记录器 NetworkLogger)时,只需创建新的具体产品类和具体工厂类,无需修改任何现有代码,完全符合​​开闭原则​​。

​​客户端与具体实现解耦​​:客户端代码只依赖于抽象接口(Logger和 LoggerFactory),不关心具体产品的创建细节,降低了模块间的耦合度。

​​将对象的创建与使用分离​​:使代码结构更清晰,创建逻辑集中在工厂中,便于统一管理和维护。

⚠️ 潜在缺点
该模式的一个主要缺点是会​​增加系统中类的数量​​。每个具体产品都对应一个具体工厂类,当产品种类非常多时,会使得系统结构变得复杂。

🌍 典型应用场景
工厂方法模式特别适用于以下情况:
​​客户端无法预知具体对象的类型​​,只知道创建对象的接口。
​​希望将产品的创建过程与使用过程分离开​​,以便于管理和扩展。
​​系统需要在未来容易地扩展新的产品种类​​。

🔄 与简单工厂模式的区别
简单工厂模式通过一个工厂类,根据传入的参数不同来创建不同的产品。虽然结构简单,但在新增产品时需要修改这个工厂类的逻辑,​​违反了开闭原则​​。工厂方法模式则通过抽象的工厂接口和多个具体的工厂类完美地解决了这个问题,是简单工厂模式的进一步深化。

http://www.dtcms.com/a/419618.html

相关文章:

  • 保健品手机网站模板搭建英文网站
  • Linux操作系统进入紧急模式(welcome to emergency mode!)
  • k8s的组件概念
  • 为什么要有线程及其生命周期
  • 京东商品评论接口(jingdong.ware.comment.get)技术解析:数据拉取与情感分析优化
  • 县级门户网站建设运营成本广州昨天发生重大新闻
  • Java 调用高德地图Sig签名遇10007 INVALID_USER_SIGNATURE的解决之道
  • 代码式绘图工具--Mermaid
  • 网站营销方式有哪些内容wordpress客户端APP
  • 如何制作网站设计网站认证必须做么
  • 桐庐住房和城乡建设局网站wordpress+中文安装
  • linux网站备份杭州网络排名优化
  • 微网站怎么自己做线上外贸平台有哪些
  • 比价网站源码wordpress转域名收费
  • org域名做网站网站空间租用
  • 超越单向观看:视频直播点播视频会议平台EasyDSS如何赋能远程实时音视频互动场景?
  • 从打孔卡到SSD:数据存储300年的进化之路
  • 【音视频】pjsua2库:Endpoint、Call类接口详解
  • 网站策划书范文模板建设一个看电影的网站
  • 网站自适应框架文档下载免费网站
  • 内蒙古建设工程造价信息网官方网站wordpress网站乱码
  • AI + 咨询 | 2025年咨询行业 AI 实战报告
  • COMSOL介电弹性体数值仿真指南:预拉伸圆形DEA的稳态变形分析(II)
  • SpringBoot连接PgSQL
  • 计算机组成原理:外围设备概述
  • 从《智能世界2035》看软件研发组织变革与未来形态
  • 人事处网站开发文献综述深圳公司有哪些
  • NET网站开发程序员招聘抚顺做网站的公司
  • 数字化工艺设计与仿真:汽车制造业成本节约与效率跃升的转型之路
  • 汽车价格战全面熄火了?不卷价格该卷什么?