Which of these design patterns is superior?

Posted by durron597 on Programmers See other posts from Programmers or by durron597
Published on 2013-05-06T01:08:07Z Indexed on 2013/06/26 22:29 UTC
Read the original article Hit count: 364

I find I tend to design class structures where several subclasses have nearly identical functionality, but one piece of it is different. So I write nearly all the code in the abstract class, and then create several subclasses to do the one different thing. Does this pattern have a name? Is this the best way for this sort of scenario?

Option 1:

public interface TaxCalc {
    String calcTaxes();
}

public abstract class AbstractTaxCalc implements TaxCalc {
    // most constructors and fields are here
    public double calcTaxes(UserFinancials data) {
        // code
        double diffNumber = getNumber(data);
        // more code
    }
    abstract protected double getNumber(UserFinancials data);
    protected double initialTaxes(double grossIncome) {
        // code
        return initialNumber;
    }
}

public class SimpleTaxCalc extends AbstractCalc {
    protected double getNumber(UserFinancials data) {
        double temp = intialCalc(data.getGrossIncome());
        // do other stuff
        return temp;
    }
}

public class FancyTaxCalc extends AbstractTaxCalc {
    protected double getNumber(UserFinancials data) {
        int temp = initialCalc(data.getGrossIncome());
        // Do fancier math
        return temp;
    }
}

Option 2:

This version is more like the Strategy pattern, and should be able to do essentially the same sorts of tasks.

public class TaxCalcImpl implements TaxCalc {
    private final TaxMath worker;
    public DummyImpl(TaxMath worker) {
        this.worker = worker;
    }
    public double calcTaxes(UserFinancials data) {
        // code
        double analyzedDouble = initialNumber;
        int diffNumber = worker.getNumber(data, initialNumber);
        // more code
    }
    protected int initialTaxes(double grossIncome) {
        // code
        return initialNumber;
    }
}

public interface TaxMath {
    double getNumber(UserFinancials data, double initial);
}

Then I could do:

TaxCalc dum = new TaxCalcImpl(new TaxMath() {
    @Override
    public double getNumber(UserFinancials data, double initial) {
        double temp = data.getGrossIncome();
        // do math
        return temp;
    });

And I could make specific implementations of TaxMath for things I use a lot, or I could make a stateless singleton for certain kinds of workers I use a lot.


So the question I'm asking is: Which of these patterns is superior, when, and why? Or, alternately, is there an even better third option?

© Programmers or respective owner

Related posts about java

Related posts about design-patterns