🏭 简单工厂模式使用场景
特征识别
- ✅ 创建同一类型的不同对象
- ✅ 创建逻辑相对简单
- ✅ 产品类型相对固定,不经常变化
- ✅ 客户端不需要知道具体的创建细节
📱 实际应用场景
1. 日志记录器
// 根据配置创建不同的日志记录器
Logger logger = LoggerFactory.createLogger("file"); // 文件日志
Logger logger = LoggerFactory.createLogger("console"); // 控制台日志
Logger logger = LoggerFactory.createLogger("database");// 数据库日志
适用原因: 都是Logger类型,只是输出目标不同
2. 数据库连接
// 根据数据库类型创建连接
Connection conn = ConnectionFactory.createConnection("mysql");
Connection conn = ConnectionFactory.createConnection("oracle");
Connection conn = ConnectionFactory.createConnection("postgresql");
适用原因: 都是Connection接口,实现方式不同
3. 图片格式处理
// 根据文件扩展名创建对应的图片处理器
ImageProcessor processor = ImageProcessorFactory.create("jpg");
ImageProcessor processor = ImageProcessorFactory.create("png");
ImageProcessor processor = ImageProcessorFactory.create("gif");
适用原因: 都处理图片,但算法不同
4. 支付方式
// 根据支付类型创建支付处理器
PaymentProcessor payment = PaymentFactory.create("alipay");
PaymentProcessor payment = PaymentFactory.create("wechat");
PaymentProcessor payment = PaymentFactory.create("bank");
适用原因: 都是支付功能,接口一致
5. 消息发送
// 根据消息类型创建发送器
MessageSender sender = MessageFactory.create("email");
MessageSender sender = MessageFactory.create("sms");
MessageSender sender = MessageFactory.create("push");
适用原因: 都是发送消息,方式不同
6. 文档解析器
// 根据文件类型创建解析器
DocumentParser parser = ParserFactory.create("pdf");
DocumentParser parser = ParserFactory.create("word");
DocumentParser parser = ParserFactory.create("excel");
7. 游戏角色创建
// 根据职业创建游戏角色
GameCharacter character = CharacterFactory.create("warrior");
GameCharacter character = CharacterFactory.create("mage");
GameCharacter character = CharacterFactory.create("archer");
8. 算法选择
// 根据算法类型创建排序器
Sorter sorter = SorterFactory.create("quicksort");
Sorter sorter = SorterFactory.create("mergesort");
Sorter sorter = SorterFactory.create("bubblesort");
🏢 抽象工厂模式使用场景
特征识别
- ✅ 创建一系列相关的对象族
- ✅ 需要保证产品族的一致性
- ✅ 需要在不同产品族间切换
- ✅ 产品之间有依赖关系
🌟 实际应用场景
1. 跨平台UI组件系统
// Windows产品族
UIFactory windowsFactory = new WindowsUIFactory();
Button winButton = windowsFactory.createButton(); // Windows按钮
Menu winMenu = windowsFactory.createMenu(); // Windows菜单
Dialog winDialog = windowsFactory.createDialog(); // Windows对话框
// Mac产品族
UIFactory macFactory = new MacUIFactory();
Button macButton = macFactory.createButton(); // Mac按钮
Menu macMenu = macFactory.createMenu(); // Mac菜单
Dialog macDialog = macFactory.createDialog(); // Mac对话框
适用原因: 同一平台的UI组件需要风格统一
2. 数据库访问层
// MySQL产品族
DatabaseFactory mysqlFactory = new MySQLFactory();
Connection mysqlConn = mysqlFactory.createConnection();
Command mysqlCmd = mysqlFactory.createCommand();
Transaction mysqlTrans = mysqlFactory.createTransaction();
// Oracle产品族
DatabaseFactory oracleFactory = new OracleFactory();
Connection oracleConn = oracleFactory.createConnection();
Command oracleCmd = oracleFactory.createCommand();
Transaction oracleTrans = oracleFactory.createTransaction();
适用原因: 同一数据库的组件需要协同工作
3. 游戏装备系统
// 新手装备族
EquipmentFactory beginnerFactory = new BeginnerEquipmentFactory();
Weapon beginnerWeapon = beginnerFactory.createWeapon(); // 新手剑
Armor beginnerArmor = beginnerFactory.createArmor(); // 新手护甲
Accessory beginnerRing = beginnerFactory.createAccessory();// 新手戒指
// 传奇装备族
EquipmentFactory legendaryFactory = new LegendaryEquipmentFactory();
Weapon legendaryWeapon = legendaryFactory.createWeapon(); // 传奇剑
Armor legendaryArmor = legendaryFactory.createArmor(); // 传奇护甲
Accessory legendaryRing = legendaryFactory.createAccessory(); // 传奇戒指
适用原因: 同等级装备需要搭配协调
4. 主题系统(网站/App)
// 深色主题族
ThemeFactory darkFactory = new DarkThemeFactory();
Background darkBg = darkFactory.createBackground(); // 深色背景
FontStyle darkFont = darkFactory.createFont(); // 深色主题字体
ColorScheme darkColors = darkFactory.createColorScheme(); // 深色配色
// 浅色主题族
ThemeFactory lightFactory = new LightThemeFactory();
Background lightBg = lightFactory.createBackground(); // 浅色背景
FontStyle lightFont = lightFactory.createFont(); // 浅色主题字体
ColorScheme lightColors = lightFactory.createColorScheme(); // 浅色配色
5. 汽车制造系统
// 豪华车系列
VehicleFactory luxuryFactory = new LuxuryVehicleFactory();
Engine luxuryEngine = luxuryFactory.createEngine(); // V8发动机
Tire luxuryTire = luxuryFactory.createTire(); // 高性能轮胎
Interior luxuryInterior = luxuryFactory.createInterior(); // 真皮内饰
// 经济车系列
VehicleFactory economyFactory = new EconomyVehicleFactory();
Engine economyEngine = economyFactory.createEngine(); // 经济型发动机
Tire economyTire = economyFactory.createTire(); // 普通轮胎
Interior economyInterior = economyFactory.createInterior(); // 布料内饰
6. 电商系统的商品展示
// 移动端产品族
DisplayFactory mobileFactory = new MobileDisplayFactory();
ProductCard mobileCard = mobileFactory.createProductCard(); // 手机端商品卡片
ReviewSection mobileReview = mobileFactory.createReview(); // 手机端评论区
PriceDisplay mobilePrice = mobileFactory.createPrice(); // 手机端价格显示
// PC端产品族
DisplayFactory pcFactory = new PCDisplayFactory();
ProductCard pcCard = pcFactory.createProductCard(); // PC端商品卡片
ReviewSection pcReview = pcFactory.createReview(); // PC端评论区
PriceDisplay pcPrice = pcFactory.createPrice(); // PC端价格显示
7. 报表系统
// Excel报表族
ReportFactory excelFactory = new ExcelReportFactory();
Chart excelChart = excelFactory.createChart(); // Excel图表
Table excelTable = excelFactory.createTable(); // Excel表格
Summary excelSummary = excelFactory.createSummary(); // Excel摘要
// PDF报表族
ReportFactory pdfFactory = new PDFReportFactory();
Chart pdfChart = pdfFactory.createChart(); // PDF图表
Table pdfTable = pdfFactory.createTable(); // PDF表格
Summary pdfSummary = pdfFactory.createSummary(); // PDF摘要
🎯 如何选择使用哪种模式?
使用简单工厂的情况:
- 🔹 只需要创建一种类型的不同实现
- 🔹 创建逻辑简单,变化不频繁
- 🔹 产品之间没有关联性
- 🔹 例如: 创建不同的支付方式、日志记录器
使用抽象工厂的情况:
- 🔸 需要创建多种相关产品
- 🔸 产品之间需要协同工作
- 🔸 要保证产品族的一致性
- 🔸 需要在不同产品族之间切换
- 🔸 例如: UI主题切换、跨平台应用开发
💡 实践建议
简单工厂实践要点:
- 保持简单:不要让工厂方法过于复杂
- 易于扩展:新增产品类型时容易修改
- 统一接口:所有产品实现相同接口
- 配置驱动:可以通过配置文件控制创建哪种产品
抽象工厂实践要点:
- 产品族规划:提前规划好产品族的结构
- 一致性保证:确保同一工厂创建的产品风格统一
- 扩展考虑:新增产品族相对容易,新增产品类型较困难
- 依赖管理:处理好产品之间的依赖关系
⚠️ 注意事项
简单工厂的局限性:
- 违反开闭原则(新增产品需修改工厂)
- 工厂类责任过重
- 难以扩展复杂的产品结构
抽象工厂的局限性:
- 新增产品类型困难(需修改所有工厂)
- 结构复杂,理解成本高
- 过度设计风险
选择合适的模式是关键,不要为了使用设计模式而使用!