gpt4 book ai didi

java - 从工厂中的字符串参数获取正确的对象

转载 作者:行者123 更新时间:2023-11-29 03:05:23 26 4
gpt4 key购买 nike

我一直在尝试找出是否有一种方法可以将字符串传递给工厂或构造函数并创建正确的对象,而不必将字符串映射到对象,或者不需要一堆 if/else 语句或开关语句。

请记住,这是一个简单的示例,因此我可以将我学到的知识应用到网络应用等更复杂的情况中。

我们以一个用JAVA编写的简单计算器应用为例


假设这是命令行,一个人可以传入 3 个值

- first number
- math operation (+ , - , / , x)
- second number

我们有一个接口(interface)

public interface ArithmeticOperation {
public double performMathOperation(double firstNum, double secondNum);
}

有 4 个实现它的类

public class AdditionOperation implements ArithmeticOperation {
public double performMathOperation(double firstNum, double secondNum) {
return firstNum + secondNum;
}
}

// public class Subtraction operation returns firstNum - secondNum
// etc...

我们有实际的 Calculator 类和 UserInput 类

public class UserInput {
public UserInput(double firstNum, double secondNum, String operation) {
this.firstNum = firstNum;
// etc...
}
}
public class Calculator {
public UserInput getInput() {
// get user input, and return it as a UserInput object
// return a UserInput object
}
public performOperation() {
UserInput uInput = getInput();
double answer = ArithmeticOperationFactory
.getSpecificOperation(uInput.operation)
.performMathOperation(uInput.firstNum, uInput.secondNum);
// send answer back to user
}
}

最后是提问最多的地方,工厂

public class ArithmeticOperationFactory {

public static ArithmeticOperation getSpecificOperation(String operation) {
// what possibilities are here?
// I don't want a map that maps strings to objects
// I don't want if/else or switch statements
// is there another way?

}
}

此外,如果有更好的方法来构建这样的系统或可以应用的设计模式,请分享。我真的很想学习一些好的面向对象设计

最佳答案

还有一个不同的方法。我不确定它是否更好。

我们必须回到接口(interface)并添加另一个方法,以便该类可以识别运算符。

public interface ArithmeticOperation {
public boolean isOperator(String operator);
public double performMathOperation(double firstNum, double secondNum);
}

我们像这样编写具体的方法:

public class AdditionOperation implements ArithmeticOperation {
@Override
public boolean isOperator(String operator) {
return operator.equals("add");
}

@Override
public double performMathOperation(double firstNum, double secondNum) {
return firstNum + secondNum;
}
}

我们将所有 ArithmeticOperation 类放在一个列表中

List<ArithmeticOperation> operations = new ArrayList<>();
operations.add(new AdditionOperation());
...

最后,我们执行这样的操作。

double answer = 0D;
for (ArithmeticOperation operation : operations) {
if (operation.isOperator(currentOperator) {
answer = operation.performMathOperation(firstNum, secondNum);
break;
}
}

关于java - 从工厂中的字符串参数获取正确的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32483298/

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