📝 今日学习主题
简单工厂模式(Simple Factory Pattern) 在实际场景中的应用
🎯 模式理解
简单工厂模式属于创建型模式,它提供了一个统一的接口来创建不同类型的对象,而无需向客户端暴露实例化的逻辑。
核心思想
• 封装变化:将对象创建的过程封装起来
• 解耦:客户端与具体产品类解耦
• 单一职责:工厂类专注于对象创建
💻 代码实践回顾
类结构设计
// 抽象产品类
public abstract class Person {
public abstract void display();
}
// 具体产品类
public class Man extends Person { /* 实现略 / }
public class Woman extends Person { / 实现略 / }
public class Robot extends Person { / 实现略 */ }
// 工厂类
public class Nvwa {
public static Person createPerson(String type) {
// 根据类型创建具体对象
}
}
🔍 模式优势分析
- 降低耦合度
客户端只需要知道产品类型标识符,无需关心具体创建细节:
// 客户端代码简洁清晰
Person person = Nvwa.createPerson("M");
person.display();
- 易于扩展
新增产品类型时,只需要:
• 添加新的产品类
• 修改工厂类的创建逻辑
• 客户端代码无需改动
- 集中化管理
所有对象的创建逻辑集中在工厂类中,便于统一管理和维护。
⚠️ 局限性思考
存在的问题
- 违反开闭原则:新增产品类型需要修改工厂类
- 工厂类职责过重:所有产品创建逻辑集中在一个类中
- 类型判断复杂:产品类型增多时,switch/case或if/else会变得冗长
🚀 改进方向
方案1:使用反射机制
public class Nvwa {
public static Person createPerson(String type) {
try {
Class<?> clazz = Class.forName("com.example." + getClassName(type));
return (Person) clazz.newInstance();
} catch (Exception e) {
throw new IllegalArgumentException("无效类型");
}
}
}
方案2:配置化工厂
// 通过配置文件映射类型与类名
@Configuration
public class PersonConfig {
@Bean
public Map<String, Class<? extends Person>> personMap() {
Map<String, Class<? extends Person>> map = new HashMap<>();
map.put("M", Man.class);
map.put("W", Woman.class);
map.put("R", Robot.class);
return map;
}
}
💡 实际应用场景
适合使用简单工厂模式的场景:
- 对象创建逻辑相对简单
- 产品类型数量有限
- 不需要频繁扩展新产品
- 客户端不关心创建细节
实际项目中的类似应用:
• 数据库连接工厂(MySQL、Oracle、SQL Server)
• 日志记录器工厂(FileLogger、ConsoleLogger)
• 文档解析器工厂(PDFParser、WordParser)
📊 学习收获总结
方面 收获
设计原则 加深了对封装变化、单一职责原则的理解
编码规范 实践了清晰的类分层和命名规范
模式认知 明确了简单工厂模式的适用边界
扩展思考 认识到模式局限性及改进方向