一、什么是工厂模式?
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。简单来说,工厂模式就像现实生活中的工厂一样,专门负责"生产产品"(即创建对象),让使用者不用关心对象是怎么被创建出来的。
1.1 工厂模式的三大核心优势
- 隐藏创建细节:就像你买手机不用关心零件怎么组装的
- 统一创建入口:所有同类型产品都从一个地方产出
- 灵活替换产品:换个工厂就能生产不同产品,使用者代码不用改
二、工厂模式的三种类型
2.1 简单工厂模式(静态工厂)
适用场景:产品种类较少且不常变化
// 产品接口
public interface IPhone {
void Call();
}
// 具体产品
public class XiaomiPhone implements IPhone { /* 实现 */ }
public class HuaweiPhone implements IPhone { /* 实现 */ }
// 手机工厂
public static class PhoneFactory {
public static IPhone CreatePhone(String brand) {
return brand switch {
"Xiaomi" -> new XiaomiPhone(),
"Huawei" -> new HuaweiPhone(),
_ -> throw new ArgumentException("不支持的品牌")
};
}
}
// 使用
var myPhone = PhoneFactory.CreatePhone("Xiaomi");
myPhone.Call();
2.2 工厂方法模式
适用场景:
- 需要支持新产品扩展
- 不同产品创建逻辑差异较大
// 抽象工厂
public interface IPhoneFactory {
IPhone CreatePhone();
}
// 具体工厂
public class XiaomiFactory implements IPhoneFactory { /* 实现 */ }
public class HuaweiFactory implements IPhoneFactory { /* 实现 */ }
// 使用
IPhoneFactory factory = new XiaomiFactory();
var phone = factory.CreatePhone();
2.3 抽象工厂模式
适用场景:
- 需要创建成套的相关产品
- 保证产品兼容性(比如都用小米生态)
// 产品族接口
public interface IDeviceFactory {
IPhone CreatePhone();
ITablet CreateTablet();
}
// 小米工厂
public class XiaomiFactory implements IDeviceFactory {
/* 实现所有小米产品 */
}
// 使用
IDeviceFactory factory = new XiaomiFactory();
var phone = factory.CreatePhone();
var tablet = factory.CreateTablet();
三、工厂模式实战案例
3.1 数据库连接工厂
public interface IDbConnectionFactory {
IDbConnection CreateConnection();
}
// SQL Server实现
public class SqlConnectionFactory implements IDbConnectionFactory {
public IDbConnection CreateConnection() {
return new SqlConnection("Server=...");
}
}
// 使用时不关心具体数据库类型
IDbConnectionFactory factory = new SqlConnectionFactory();
using var connection = factory.CreateConnection();
3.2 日志记录器工厂
public interface ILoggerFactory {
ILogger CreateLogger();
}
// 文件日志实现
public class FileLoggerFactory implements ILoggerFactory {
public ILogger CreateLogger() {
return new FileLogger("log.txt");
}
}
四、工厂模式深度解析
4.1 与传统创建方式的对比
传统方式:
Sample sample = new Sample();
工厂模式:
public class Factory {
public static ISample creator(int which) {
if (which==1) return new SampleA();
else if (which==2) return new SampleB();
}
}
ISample sampleA = Factory.creator(1);
优势:将创建实例的工作与使用实例的工作分开,降低耦合度
4.2 工厂模式思考
优势:
- 新增产品类型时,只需要扩展工厂,不用修改已有代码
- 符合开闭原则(对扩展开放,对修改封闭)
代价:
- 需要多写一些工厂类和接口,代码量会增加
- 对于简单场景,可以用依赖注入容器替代
五、最佳实践与常见误区
5.1 何时使用工厂模式?
- 创建对象的过程复杂且需要隔离时
- 需要动态地创建对象,且创建过程需要根据不同条件调整
- 需要创建一系列相关对象,且这些对象之间的依赖关系需要保持一致
5.2 常见误区
- 过度使用工厂模式:简单对象直接new即可
- 违反单一职责原则:一个工厂类负责太多产品的创建
- 忽略线程安全问题:多线程环境下需要考虑工厂的线程安全
六、总结
工厂模式就像现实中买家具可以直接去宜家(工厂),而不用自己找木匠、铁匠一样,它让对象创建变得更简单、更专业!
关键点总结:
- 简单工厂适合产品种类少且固定的场景
- 工厂方法模式更符合开闭原则,扩展性好
- 抽象工厂模式适合创建产品族