文章目录
【Java设计模式】工厂工具包模式
一、概述
Java中的工厂工具包模式是一种强大的设计模式,有助于创建具有分离的构建器和工厂接口的工厂。该模式对于管理复杂的对象创建场景至关重要。
二、别名
- 对象工具包
- 工具包
三、工厂工具包设计模式的意图
工厂工具包模式的目的是在Java中创建具有分离的构建器和工厂接口的工厂,以有效地管理复杂的对象创建情况。
四、通过实际示例详细解释工厂工具包模式
实际示例:
工厂工具包模式的一个现实世界类比是餐厅厨房,它能够高效地准备不同类型的菜肴。这种设置促进了灵活性和一致性,类似于工厂工具包模式在Java中的运作方式。想象一下,厨房有一个中央站,注册了不同菜肴的各种食材和食谱。当订单进来时,厨师咨询这个中央站,收集必要的食材,并按照注册的食谱准备菜肴。这种设置允许厨房有效地管理和在不同的菜肴准备之间切换,而无需每个厨师知道每个食谱的细节,促进了烹饪过程中的灵活性和一致性。
通俗解释:
工厂工具包是一个可配置的对象构建器,是创建工厂的工厂。
五、Java中工厂工具包模式的编程示例
想象一下,在Java中有一个神奇的武器工厂,能够使用工厂工具包模式创建任何所需的武器。这种模式允许使用可配置的对象构建器,非常适合对象类型事先未知的场景。
在激活时,大师会念出所需武器类型的名称来配置它。一旦设置完成,任何这些武器类型都可以立即被召唤。
首先,我们定义简单的Weapon
层次结构。
public interface Weapon {
}
public enum WeaponType {
SWORD,
AXE,
BOW,
SPEAR
}
public class Sword implements Weapon {
@Override
public String toString() {
return "Sword";
}
}
// Axe、Bow和Spear的定义类似...
接下来,我们定义一个函数式接口,允许将带有名称的构建器添加到工厂中。
public interface Builder {
void add(WeaponType name, Supplier<Weapon> supplier);
}
示例的核心是WeaponFactory
接口,它有效地实现了工厂工具包模式。方法#factory
用于使用需要能够构建的类来配置工厂。然后,使用方法#create
来创建对象实例。
public interface WeaponFactory {
static WeaponFactory factory(Consumer<Builder> consumer) {
var map = new HashMap<WeaponType, Supplier<Weapon>>();
consumer.accept(map::put);
return name -> map.get(name).get();
}
Weapon create(WeaponType name);
}
现在,我们可以展示如何使用WeaponFactory
。
public static void main(String[] args) {
var factory = WeaponFactory.factory(builder -> {
builder.add(WeaponType.SWORD, Sword::new);
builder.add(WeaponType.AXE, Axe::new);
builder.add(WeaponType.SPEAR, Spear::new);
builder.add(WeaponType.BOW, Bow::new);
});
var list = new ArrayList<Weapon>();
list.add(factory.create(WeaponType.AXE));
list.add(factory.create(WeaponType.SPEAR));
list.add(factory.create(WeaponType.SWORD));
list.add(factory.create(WeaponType.BOW));
list.forEach(weapon -> LOGGER.info("{}", weapon.toString()));
}
运行示例时的控制台输出如下。
06:32:23.026 [main] INFO com.iluwatar.factorykit.App -- Axe
06:32:23.029 [main] INFO com.iluwatar.factorykit.App -- Spear
06:32:23.029 [main] INFO com.iluwatar.factorykit.App -- Sword
06:32:23.029 [main] INFO com.iluwatar.factorykit.App -- Bow
六、何时在Java中使用工厂工具包模式
当以下情况时使用工厂工具包模式:
- 工厂类无法预测必须创建的对象的类型,并且需要一个新的自定义构建器实例。
- 需要一个新的自定义构建器实例而不是全局的。
- 工厂可以构建的对象类型需要在类外部定义。
- 需要分离构建器和创建者接口。
- 游戏开发和其他具有用户自定义的应用程序。
七、工厂工具包模式在Java中的实际应用
- 在Java库中,如Java开发工具包(JDK),其中可能根据运行时环境实例化不同的渲染引擎。
- 在像Spring这样的框架或大量使用依赖注入的应用程序中,经常实现此模式以更灵活地管理对象创建。
八、工厂工具包模式的好处和权衡
好处:
- Java中的工厂工具包模式通过消除将特定于应用程序的类绑定到代码中的需要,促进了松散耦合。
- 它通过将实例化的责任转移到工厂对象来简化代码,使开发过程更高效。
权衡:
- 通过需要额外的类和接口,可能会给代码带来复杂性。
- 如果管理不当,有时可能会导致依赖问题。