目录
定义
定义了一个创建对象的接口,但由子类决定要实例化的类是哪个。工厂方法让类把实例化推迟到子类。
结构
简单工厂与工厂方法的对比说明
1)扩展机制
简单工厂模式在新增产品类型时,需修改工厂类的逻辑(如增加 switch/if 分支),违反开闭原则。
工厂方法模式通过新增具体工厂子类实现新产品的创建(如新增 FactoryB,完成新产品 ProductC和ProductD的创建),无需修改原有工厂代码,符合开闭原则。
2)职责分配
简单工厂模式下,单一工厂类负责所有产品的创建逻辑,集中管理导致工厂类职责过重。
工厂方法模式下,每个具体工厂子类只负责创建一类产品,实现创建逻辑的解耦。
适应场景
1)产品类型需频繁扩展(如日志系统需支持新增文件日志、网络日志等)。
2)需要隔离产品创建逻辑,避免工厂类过于庞大
使用示例
这里以日志输出为例,给出工厂方法模式的简单应用。
定义日志接口
/**
* 定义抽象产品
*/
public interface Logger {
void info(String message);
void debug(String message);
void error(String message);
void warn(String message);
}
定义具体产品1
public class FileLogger implements Logger {
@Override
public void warn(String message) {
System.out.println("文件 warn级别日志:" + message);
}
@Override
public void error(String message) {
System.out.println("文件 error级别日志:" + message);
}
@Override
public void debug(String message) {
System.out.println("文件 debug级别日志:" + message);
}
@Override
public void info(String message) {
System.out.println("文件 info级别日志:" + message);
}
}
定义具体产品2
public class ConsoleLogger implements Logger {
@Override
public void warn(String message) {
System.out.println("控制台 warn级别日志:" + message);
}
@Override
public void error(String message) {
System.out.println("控制台 error级别日志:" + message);
}
@Override
public void debug(String message) {
System.out.println("控制台 debug级别日志:" + message);
}
@Override
public void info(String message) {
System.out.println("控制台 info级别日志:" + message);
}
}
定义抽象工厂
public interface LoggerFactory {
Logger createLogger();
}
定义生产产品1的具体工厂
public class FileLoggerFactory implements LoggerFactory{
@Override
public Logger createLogger() {
return new FileLogger();
}
}
定义生产产品2的具体工厂
public class ConsoleLoggerFactory implements LoggerFactory{
@Override
public Logger createLogger() {
return new ConsoleLogger();
}
}
测试
public class Client {
public static void main(String[] args) {
Logger log = new FileLoggerFactory().createLogger();
log.info("This is an info message");
log = new ConsoleLoggerFactory().createLogger();
log.error("This is a error message");
}
}