设计模式是软件开发中解决常见问题的可重用方案,而工厂方法模式是其中一种创建型设计模式。它就像生活中的工厂一样,专门负责“生产”对象,而不用让使用者直接去new一个对象。下面我用白话文来解释工厂方法模式的核心思想、应用场景和简单例子。
一、什么是工厂方法模式?
想象一下,你要买一辆车,但不想自己去汽车厂组装,而是去4S店(工厂)告诉销售员你需要什么车型。销售员根据你的需求,从库存里取出一辆现成的车给你。工厂方法模式就是这样:定义一个创建对象的接口,但让子类决定具体实例化哪个类。这样,使用者不需要知道对象创建的细节,只需要通过工厂来获取对象。
二、为什么用工厂方法模式?
- 解耦对象创建:如果直接new对象,代码会紧密耦合。使用工厂方法,创建逻辑被封装在工厂里,修改时不影响其他代码。
- 扩展性好:当需要添加新类型时,只需新增一个工厂子类,而不需要改动现有代码。
- 符合开闭原则:对扩展开放,对修改关闭。
三、工厂方法模式的结构
工厂方法模式通常包含以下角色:
- 抽象产品(Product):定义产品的接口,比如“汽车”接口。
- 具体产品(Concrete Product):实现抽象产品的具体类,比如“轿车”、“SUV”。
- 抽象工厂(Factory):声明创建产品的方法,比如“造车方法”。
- 具体工厂(Concrete Factory):实现抽象工厂,负责创建具体产品,比如“轿车工厂”、“SUV工厂”。
四、一个简单例子
假设我们有一个汽车生产系统:
- 抽象产品:Car接口,有一个drive方法。
- 具体产品:SedanCar(轿车)和SUVCar(SUV),分别实现drive方法。
- 抽象工厂:CarFactory接口,有一个createCar方法。
- 具体工厂:SedanFactory和SUVFactory,分别创建轿车和SUV对象。
使用时,用户只需要调用具体工厂的createCar方法,就能得到对应的汽车对象,而不需要知道具体怎么创建的。
五、应用场景
工厂方法模式适用于以下情况:
- 当对象创建过程复杂,或需要根据条件动态决定创建哪种对象时。
- 在框架中,希望让子类控制对象的创建。
- 需要解耦客户端代码和具体类。
六、总结
工厂方法模式让代码更灵活、可维护,它把对象的创建和使用分开,就像现实中的工厂一样,提高了软件的可扩展性。下次当你需要创建对象时,想想是否可以用工厂方法来简化代码!