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

工厂方法模式 Factory Method Pattern

基本内容

定义一个创建对象的工厂方法接口,让实现该接口的类来决定实例化的类。该模式将对象的创建逻辑封装在工厂方法中。
该模式解决了产品拓展问题,如果使用万能工厂(即简单工厂模式),随着产品的增多,则不便于维护,所以根据单一职责原则,我们进行了拆分,让一个类只有一个职能。例如Java课程由Java工厂创建,python由python工厂创建。
当然如果产品少而且没有什么新增需求,则使用简单工厂模式仍然是合适的,反而避免了过度设计。

与简单工厂模式的区别

简单工厂模式 把所有创建逻辑集中在一个类里,是由一个工厂类根据参数决定创建哪一个具体实现类的实例;
基本流程是:定义接口 + 不同实现类 + 工厂依赖接口 + 根据参数创建不同实现类对象

工厂方法模式 是将创建逻辑交给子类的工厂类,每个子类负责创建一个具体产品。符合单一职责原则,扩展性更好,可维护性也更好

不同适用场景

简单工厂模式 产品种类少、变化不频繁,快速开发
工厂方法模式 产品种类多、变化频繁,需要扩展性强

示例对比

简单工厂模式

// 产品接口
public interface Logger {void log(String message);
}// 具体产品A
public class ConsoleLogger implements Logger {public void log(String message) {System.out.println("控制台日志: " + message);}
}// 具体产品B
public class FileLogger implements Logger {public void log(String message) {System.out.println("文件日志: " + message);}
}// 简单工厂类
public class LoggerFactory {public static Logger getLogger(String type) {if ("console".equals(type)) {return new ConsoleLogger();} else if ("file".equals(type)) {return new FileLogger();}return null;}
}// 使用
Logger logger = LoggerFactory.getLogger("console");
logger.log("Hello");

如果再增加一个 DatabaseLogger,必须修改 LoggerFactory 类,不符合开闭原则。

工厂方法模式

// 产品接口
public interface Logger {void log(String message);
}// 产品实现
public class ConsoleLogger implements Logger {public void log(String message) {System.out.println("控制台日志: " + message);}
}public class FileLogger implements Logger {public void log(String message) {System.out.println("文件日志: " + message);}
}// 抽象工厂
public interface LoggerFactory {Logger createLogger();
}// 具体工厂
public class ConsoleLoggerFactory implements LoggerFactory {public Logger createLogger() {return new ConsoleLogger();}
}public class FileLoggerFactory implements LoggerFactory {public Logger createLogger() {return new FileLogger();}
}// 使用
LoggerFactory factory = new ConsoleLoggerFactory();
Logger logger = factory.createLogger();
logger.log("Hello");

假设我们需要新增一个DatabaseLoggerFactory ,则不需要修改已有类,扩展性强,符合开闭原则。

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

相关文章:

  • 监控场景视频质量异常修复:陌讯动态增强算法实战解析
  • 深入浅出设计模式——创建型模式之建造者模式 Builder
  • LangChain API 功能介绍和使用示例
  • 单卡10分钟部署MiniCPM4-0.5B:轻量级大模型本地运行指南
  • ESP8266 AT 固件
  • Linux信号量:进程同步与互斥的核心机制
  • 人形机器人指南(十四)集成
  • 248°视野里的温柔革命:当清洁成为治愈城市的艺术
  • Qt 移动应用界面设计原则
  • 智能Agent场景实战指南 Day 23 : Agent安全与隐私保护
  • C++异常捕获:为何推荐按引用(by reference)捕获?
  • 【LeetCode 热题 100】(二)双指针
  • 基于Java+SQLServer2017实现(Web)酒店客房管理系统
  • MongoDB系列教程-教程概述
  • 系统选择菜单(ubuntu grub)介绍
  • 标量子查询 外表有多少重复值决定filter次数 转化 left join
  • Python三大Web框架:FastAPI vs Flask vs Django 详解与快速入门指南
  • BreachForums 黑客论坛强势回归
  • windows软件ARM64和AMD64(x64)区别,如何查看电脑支持哪种
  • JVM易混淆名称
  • 大型微服务项目:听书——多端重复提交订单问题适配器模式实现不同支付方式的选择零钱支付逻辑
  • 爬虫逆向之瑞数五案例:某某医学院(补环境,联调)
  • 适配器模式的三种C++实现
  • 宠物经济行业研究系列报告
  • electron-vite 动态加载脚本 实现动态插件
  • 如何为你的WordPress网站选择合适的安全插件
  • 【效率工具】255款工作计划表格Excel电子版模板:总结日月周报日历安排提醒时间管理
  • 遍历-找到匹配的节点
  • 零基础-动手学深度学习-7.6. 残差网络(ResNet)
  • [leetcode] 子集