Java 中的工厂方法模式:通过多态制造增强灵活性
约 3 分钟
也称为
- 虚拟构造函数
工厂方法设计模式的意图
使用工厂方法模式定义一个用于创建对象的接口,但让子类决定要实例化的类。这种创建型设计模式允许类将实例化推迟到子类,从而提高代码灵活性并简化维护。
工厂方法模式的详细解释以及现实世界示例
现实世界示例
想象一家物流公司需要配送不同类型的包裹:标准包裹、快递包裹和超大型包裹。该公司有一个处理配送请求的中心系统,但不知道每种包裹类型是如何处理的。为了管理这个问题,公司使用了工厂方法模式。
在这种设置中,有一个中心
DeliveryRequest
类,其中包含一个方法createPackage()
。该方法在子类(如StandardDelivery
、ExpressDelivery
和OversizedDelivery
)中被重写,每个子类都知道如何创建和管理相应的包裹类型。这样,中心系统就可以处理配送请求,而无需了解每种包裹类型是如何创建和处理的,从而实现灵活性并简化维护。
简单来说
它提供了一种将实例化逻辑委托给子类的机制。
维基百科说
在基于类的编程中,工厂方法模式是一种创建型模式,它使用工厂方法来解决创建对象的问题,而无需指定要创建的对象的确切类。这是通过调用工厂方法来创建对象实现的——该方法要么在接口中指定并在子类中实现,要么在基类中实现并可以选择性地由派生类重写——而不是调用构造函数。
Java 中工厂方法模式的编程示例
正如我们在以下示例中看到的,工厂方法方法是 Java 设计模式中实现灵活且可维护代码的关键。
铁匠制造武器。精灵需要精灵武器,兽人需要兽人武器。根据手头的客户类型,召唤合适的铁匠类型。
首先,我们有一个 Blacksmith
接口和一些它的实现
public interface Blacksmith {
Weapon manufactureWeapon(WeaponType weaponType);
}
public class ElfBlacksmith implements Blacksmith {
public Weapon manufactureWeapon(WeaponType weaponType) {
return ELFARSENAL.get(weaponType);
}
}
public class OrcBlacksmith implements Blacksmith {
public Weapon manufactureWeapon(WeaponType weaponType) {
return ORCARSENAL.get(weaponType);
}
}
当客户来的时候,会召唤正确的铁匠类型,并制造所需的武器
public static void main(String[] args) {
Blacksmith blacksmith = new OrcBlacksmith();
Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
LOGGER.info(MANUFACTURED, blacksmith, weapon);
weapon = blacksmith.manufactureWeapon(WeaponType.AXE);
LOGGER.info(MANUFACTURED, blacksmith, weapon);
blacksmith = new ElfBlacksmith();
weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
LOGGER.info(MANUFACTURED, blacksmith, weapon);
weapon = blacksmith.manufactureWeapon(WeaponType.AXE);
LOGGER.info(MANUFACTURED, blacksmith, weapon);
}
程序输出
06:40:07.269 [main] INFO com.iluwatar.factory.method.App -- The orc blacksmith manufactured an orcish spear
06:40:07.271 [main] INFO com.iluwatar.factory.method.App -- The orc blacksmith manufactured an orcish axe
06:40:07.272 [main] INFO com.iluwatar.factory.method.App -- The elf blacksmith manufactured an elven spear
06:40:07.272 [main] INFO com.iluwatar.factory.method.App -- The elf blacksmith manufactured an elven axe
何时在 Java 中使用工厂方法模式
在 Java 中使用工厂方法模式时
- 类无法预测它必须创建的对象的类。
- 类希望它的子类指定它创建的对象。
- 类将职责委托给几个辅助子类之一,并且希望将有关哪个辅助子类是委托者的知识本地化。
Java 中工厂方法模式的现实世界应用
- java.util.Calendar
- java.util.ResourceBundle
- java.text.NumberFormat
- java.nio.charset.Charset
- java.net.URLStreamHandlerFactory
- java.util.EnumSet
- javax.xml.bind.JAXBContext
- 在运行时动态配置的应用程序组件框架。
工厂方法模式的优缺点
优点
- 工厂方法模式为子类提供挂钩,从而提高代码灵活性并简化维护。
- 连接并行的类层次结构。
- 无需将特定于应用程序的类绑定到代码中。代码只处理产品接口;因此,它可以与任何用户定义的具体产品类一起工作。
权衡
- 可能通过要求添加新子类来实现扩展的工厂方法,从而使代码复杂化。