Java工厂模式
工厂模式将对象创建与使用分离,降低耦合度。
模式定义
意图:定义创建对象的接口,让子类决定创建哪个类。
三种工厂模式
| 类型 | 特点 |
|---|---|
| 简单工厂 | 一个工厂创建多种产品 |
| 工厂方法 | 每种产品一个工厂 |
| 抽象工厂 | 创建产品族 |
简单工厂
产品接口
Java
public interface Product {
void use();
}
public class ProductA implements Product {
@Override
public void use() {
System.out.println("使用产品A");
}
}
public class ProductB implements Product {
@Override
public void use() {
System.out.println("使用产品B");
}
}
工厂实现
Java
public class SimpleFactory {
public static Product create(String type) {
switch (type) {
case "A":
return new ProductA();
case "B":
return new ProductB();
default:
throw new IllegalArgumentException("未知产品类型");
}
}
}
// 使用
Product product = SimpleFactory.create("A");
product.use();
优点:简单易用 缺点:新增产品需修改工厂,违反开闭原则
工厂方法模式
工厂接口
Java
public interface Factory {
Product create();
}
具体工厂
Java
public class FactoryA implements Factory {
@Override
public Product create() {
return new ProductA();
}
}
public class FactoryB implements Factory {
@Override
public Product create() {
return new ProductB();
}
}
使用
Java
Factory factory = new FactoryA();
Product product = factory.create();
product.use();
优点:新增产品只需新增工厂,符合开闭原则 缺点:类数量增加
实际应用示例
Java
// 日志记录器工厂
public interface Logger {
void log(String message);
}
public class FileLogger implements Logger {
@Override
public void log(String message) {
System.out.println("文件日志: " + message);
}
}
public class ConsoleLogger implements Logger {
@Override
public void log(String message) {
System.out.println("控制台日志: " + message);
}
}
public interface LoggerFactory {
Logger createLogger();
}
public class FileLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
return new FileLogger();
}
}
public class ConsoleLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
return new ConsoleLogger();
}
}
// 使用
LoggerFactory factory = new FileLoggerFactory();
Logger logger = factory.createLogger();
logger.log("系统启动");
Spring中的工厂模式
Spring的BeanFactory就是工厂模式的典型应用:
Java
BeanFactory beanFactory = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) beanFactory.getBean("userService");
工厂模式适用场景
- 创建对象逻辑复杂
- 需要解耦对象创建和使用
- 产品类型可能扩展
- 需要灵活切换产品
简单工厂 vs 工厂方法
| 特性 | 简单工厂 | 工厂方法 |
|---|---|---|
| 工厂数量 | 1个 | 多个 |
| 扩展性 | 修改工厂 | 新增工厂 |
| 复杂度 | 简单 | 略复杂 |
| 符合开闭 | 否 | 是 |
注意事项
产品需有共同接口或父类
工厂方法模式类数量会增加
简单工厂适合产品固定的场景
工厂方法适合产品可能扩展的场景
要点总结
- 工厂模式将创建逻辑封装,实现创建与使用解耦
- 简单工厂:一个工厂创建多种产品,简单但扩展性差
- 工厂方法:每种产品一个工厂,符合开闭原则
- 产品需有共同接口,工厂返回接口类型
- Spring的BeanFactory是工厂模式的经典应用
📝 发现内容有误?点击此处直接编辑