簡體   English   中英

方法重載與工廠

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM