深入浅出工厂模式:从入门到精通(2025最新版)

#王者杯·14天创作挑战营·第2期#

一、什么是工厂模式?

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。简单来说,​​工厂模式就像现实生活中的工厂一样​​,专门负责"生产产品"(即创建对象),让使用者不用关心对象是怎么被创建出来的。

1.1 工厂模式的三大核心优势

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

二、工厂模式的三种类型

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 常见误区

  1. ​过度使用工厂模式​​:简单对象直接new即可
  2. ​违反单一职责原则​​:一个工厂类负责太多产品的创建
  3. ​忽略线程安全问题​​:多线程环境下需要考虑工厂的线程安全

六、总结

工厂模式就像现实中买家具可以直接去宜家(工厂),而不用自己找木匠、铁匠一样,它让对象创建变得更简单、更专业!

​关键点总结​​:

  1. 简单工厂适合产品种类少且固定的场景
  2. 工厂方法模式更符合开闭原则,扩展性好
  3. 抽象工厂模式适合创建产品族
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值