C# 工厂模式通俗讲解
工厂模式就像现实生活中的工厂一样,专门负责"生产产品"。在编程中,它负责创建对象,让使用者不用关心对象是怎么被创建出来的。
🌟 工厂模式的三大好处
- 隐藏创建细节:就像你买手机不用关心零件怎么组装的
- 统一创建入口:所有同类型产品都从一个地方产出
- 灵活替换产品:换个工厂就能生产不同产品,使用者代码不用改
🏭 三种常见工厂模式
1. 简单工厂模式(静态工厂)
// 产品接口
public interface IPhone
{
void Call();
}
// 具体产品
public class XiaomiPhone : IPhone { /* 实现 */ }
public class HuaweiPhone : 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. 工厂方法模式
// 抽象工厂
public interface IPhoneFactory
{
IPhone CreatePhone();
}
// 具体工厂
public class XiaomiFactory : IPhoneFactory { /* 实现 */ }
public class HuaweiFactory : IPhoneFactory { /* 实现 */ }
// 使用
IPhoneFactory factory = new XiaomiFactory();
var phone = factory.CreatePhone();
✔️ 适用场景:
- 需要支持新产品扩展
- 不同产品创建逻辑差异较大
3. 抽象工厂模式
// 产品族接口
public interface IDeviceFactory
{
IPhone CreatePhone();
ITablet CreateTablet();
}
// 小米工厂
public class XiaomiFactory : IDeviceFactory { /* 实现所有小米产品 */ }
// 使用
IDeviceFactory factory = new XiaomiFactory();
var phone = factory.CreatePhone();
var tablet = factory.CreateTablet();
✔️ 适用场景:
- 需要创建成套的相关产品
- 保证产品兼容性(比如都用小米生态)
🔧 实际开发案例
数据库连接工厂
public interface IDbConnectionFactory
{
IDbConnection CreateConnection();
}
// SQL Server实现
public class SqlConnectionFactory : IDbConnectionFactory
{
public IDbConnection CreateConnection()
{
return new SqlConnection("Server=...");
}
}
// 使用时不关心具体数据库类型
IDbConnectionFactory factory = new SqlConnectionFactory();
using var connection = factory.CreateConnection();
日志记录器工厂
public interface ILoggerFactory
{
ILogger CreateLogger();
}
// 文件日志实现
public class FileLoggerFactory : ILoggerFactory
{
public ILogger CreateLogger()
{
return new FileLogger("log.txt");
}
}
💡 工厂模式思考
- 优势:新增产品类型时,只需要扩展工厂,不用修改已有代码
- 代价:需要多写一些工厂类和接口,代码量会增加
- 替代方案:对于简单场景,可以用依赖注入容器(如ASP.NET Core的DI)替代
就像现实中买家具可以直接去宜家(工厂),而不用自己找木匠、铁匠一样,工厂模式让对象创建变得更简单、更专业!
**借鉴某些博主的内容
public interface IFruit
{
/// <summary>
/// 水果的数量
/// </summary>
double Amount { get; }
/// <summary>
/// 种植
/// </summary>
/// <param name="amount"></param>
void Plant(int amount);
/// <summary>
/// 生成
/// </summary>
/// <param name="days"></param>
void Grow(int days);
/// <summary>
/// 收成
/// </summary>
/// <returns></returns>
double Harvest();
}
public class Pineapple : IFruit
{
public double Amount { get; private set; }
public void Grow(int days)
{
Amount *= days * 0.85;
}
public double Harvest()
{
return Amount;
}
public void Plant(int amount)
{
Amount = amount;
}
}
public class Tomato : IFruit
{
public double Amount { get; private set; }
public void Grow(int days)
{
Amount *= days * 2;
}
public double Harve

最低0.47元/天 解锁文章
317

被折叠的 条评论
为什么被折叠?



