社区讨论LinuxDo 最新
Java开发教程27-工厂方法模式
本期是Java开发教程系列的第二十七期,设计模式专题第一期,讲工厂方法模式:把"创建对象"这件事从业务代码里请出去,集中管理.这是创建型模式的开篇,也是你见过的第一个"模式"名字:第 19 期的 Executors.newFixedThreadPool(),背后就是它.若你已经理解简单工厂与工厂方法的区别,可以跳过本期内容. 每期叠甲: 时间仓促,水平有限,文中难免存在缺点和错误,恳请广大开发者和从业者指正. 一、问题:到处 new 有什么不好 假设要写一个日志系统,支持三种日志:控制台打印、写文件、发数据库.最…
内容摘要
作者:#xianaldai
板块:#文档共建
本期是Java开发教程系列的第二十七期,设计模式专题第一期,讲工厂方法模式:把"创建对象"这件事从业务代码里请出去,集中管理.这是创建型模式的开篇,也是你见过的第一个"模式"名字:第 19 期的 Executors.newFixedThreadPool(),背后就是它.若你已经理解简单工厂与工厂方法的区别,可以跳过本期内容.
每期叠甲:
时间仓促,水平有限,文中难免存在缺点和错误,恳请广大开发者和从业者指正.
一、问题:到处 new 有什么不好
假设要写一个日志系统,支持三种日志:控制台打印、写文件、发数据库.最直白的写法:
// 业务代码里,到处是这种分支
Logger logger;
String type = config.get("logger.type");
if (type.equals("console")) {
logger = new ConsoleLogger();
} else if (type.equals("file")) {
logger = new FileLogger("app.log");
} else {
logger = new DatabaseLogger();
}
logger.log("玩家上线");
这段"选择哪种日志、怎么构造"的逻辑,会出现在每一个需要日志的类里.十几个类,每处复制一份.问题随之而来:
改动扩散:日志类型想加一种(比如网络日志),这十几个地方的 if-else 全要改
依赖混乱:业务代码直接依赖所有 Logger 实现类,第 7 期讲的"面向接口"形同虚设
构造细节泄漏:业务代码不该知道"文件日志要传文件名"
解决方向:把"怎么造 Logger"集中到一个地方,业务代码只说"我要个 Logger".这就是工厂的由来.
二、简单工厂:一个方法,按参数造
先把创建逻辑收进一个类:
public class LoggerFactory {
// 简单工厂:一个静态方法,按类型返回不同对象
public static Logger cre
资讯来源
LinuxDo