[英]Method overloading vs factory
可以說,在保持向后兼容性的同時,我們需要基於標志在多個類的多個方法中進行一些邏輯更改。
有兩種方法。
1.重載每個類中的每個方法。 然后以調用者代碼中的if-else階梯結尾,以調用正確的方法。
2.制作一個通用的界面和一個Factory。 根據傳遞給工廠的標志返回其中一個對象。 呼叫者不需要任何更改。 創建對象時只需要進行一些更改。 僅為兩種類型創建工廠是否合乎邏輯?
根據您的經驗,您會選擇哪個? 如何在這兩種方式之間做出決定? 您可以建議更好的方法嗎?
邏輯上的變化暗示着行為,這暗示了策略模式。 這避免了對現有方法簽名的更改。
但是您仍然可以使用工廠來集中處理邏輯的具體策略對象的創建。
import java.util.Random;
public class App {
public static void main(String[] args) {
App app = new App();
app.calculateSomething(new Random().nextBoolean());
}
private void calculateSomething(boolean isUsingLegacyLogic) {
CalculationStrategyFactory factory = new CalculationStrategyFactory();
CalculationStrategy strategy = factory.getCalculationStrategy(isUsingLegacyLogic);
Calculator calculator = new Calculator(strategy);
calculator.calculate();
}
class Calculator {
CalculationStrategy calculationStrategy;
Calculator(CalculationStrategy calculationStrategy) {
this.calculationStrategy = calculationStrategy;
}
// ...
public double calculate() {
// original code
// ...
// System.out.println("Calculation steps were done in sequential order.");
// return 0;
return calculationStrategy.calculate(this);
}
}
private interface CalculationStrategy {
double calculate(Calculator c);
}
private class SequentialCalculationHandler implements CalculationStrategy {
public double calculate(Calculator c) {
// ...
System.out.println("Calculation steps were done in sequential order.");
return 0;
}
}
private class ParallelCalculationHandler implements CalculationStrategy {
public double calculate(Calculator c) {
// ...
System.out.println("Calculation steps were done in parralel.");
return 0;
}
}
private class CalculationStrategyFactory {
public CalculationStrategy getCalculationStrategy(boolean isUsingLegacyLogic) {
if (isUsingLegacyLogic || Runtime.getRuntime().availableProcessors() == 1) {
return new SequentialCalculationHandler();
}
return new ParallelCalculationHandler();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.