C#设计模式--工厂模式

C# 工厂模式通俗讲解

工厂模式就像现实生活中的工厂一样,专门负责"生产产品"。在编程中,它负责创建对象,让使用者不用关心对象是怎么被创建出来的。

🌟 工厂模式的三大好处

  1. 隐藏创建细节:就像你买手机不用关心零件怎么组装的
  2. 统一创建入口:所有同类型产品都从一个地方产出
  3. 灵活替换产品:换个工厂就能生产不同产品,使用者代码不用改

🏭 三种常见工厂模式

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值