gpt4 book ai didi

java - 如何增加一个新类型而不需要修改工厂类?

转载 作者:行者123 更新时间:2023-11-30 06:00:26 25 4
gpt4 key购买 nike

当我使用工厂模式时,我有一个问题:当我有一个新类型时,我需要修改我的工厂类。比如:

动物.java:

public interface Animal {
void eat();
}

Dog.java:

public class Dog implements Animal {
...
@Override
public void eat(){
System.out.println("eat bones");
}
}

Cat.java

public class Cat implements Animal {
...
@Override
public void eat(){
System.out.println("eat fish");
}
}

现在我有一个 Animal 接口(interface)和两个 Animal 类,然后我在这里有我的工厂:

public class AnimalFactory {
public static final int Dog = 1;
public static final int Cat = 2;

public static Animal getAnimal(int type) {
switch(type) {
case Dog: return new Dog();
case Cat: return new Cat();
default: return null;
}
}
}

这很简单,但是如果我有一个新类型 Mouse ,我必须修改我的工厂以添加一个 case 语句,例如 case Mouse: return new Mouse

那么,有没有一种方法可以增加新类型而不需要修改我的工厂类?

最佳答案

要创建一个工厂,无需为添加/删除的每个 Animal 类型进行更新/修改,您必须提取检索 Animal 类及其工厂的逻辑Animal 类本身的标识符。
广义上,所有动物子类都应该实现一个返回工厂标识符的方法,并且在工厂中,您应该首先从特定包加载实现此接口(interface)的所有类。使用reflections library来加载类会更简单。 .
但在编译时实现它既不直接,也不安全可靠。
如果不维护工厂,更好的选择是使用依赖项注入(inject)框架提供的工厂功能。
不再需要工厂类。

在 Spring 中,Dog 可以声明为:

@Component
@Scope("prototype")
public class Dog extends Animal{..}

请注意原型(prototype)范围,以指示必须在每次注入(inject)时创建一个新实例。

从客户端,您可以注入(inject) Animal 实例,例如:

@Autowired
private Dog dog;

或者使用显式工厂 Dog dog = ApplicationContext.getBean("dog");

关于java - 如何增加一个新类型而不需要修改工厂类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52352980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com