Я не могу быть полностью уверен, но похоже, что вы слишком сильно беспокоитесь о проблемах производительности, связанных с созданием многих экземпляров данного объекта.
ИМХО, вам следует сначала побеспокоиться о дизайне, ипозже вы можете беспокоиться о производительности, если такие вещи станут проблемой.Честно говоря, ваш класс не похож на тот класс, для которого у вас будет миллион объектов, плавающих в куче.
Ваш интерфейс - это то, что называется SAM Type (единственный абстрактный метод).И их множество в самом JDK.Например, java.util.Comparator и java.lang.Comparable являются двумя хорошими примерами.
Если вы определяете свой метод как статический, он должен основываться на вашем дизайне, а не на функциональности или простоте задачичто это делает.Вы можете знать свой дизайн лучше, чем кто-либо другой, и разработчики этого форума могут помочь вам с хорошими идеями или оспорить ваши текущие, которые могут помочь улучшить то, что у вас уже есть.
Упомянутый вами шаблон синглтона предназначен для предотвращения создания более чем заранее определенного числа экземпляров данного класса, чаще всего они ограничивают его одним экземпляром.В вашем дизайне неясно, почему вы хотели бы сделать такую вещь, но беспокойство по поводу производительности, связанное с количеством экземпляров, не кажется здесь лучшей причиной.
В поисках способов упростить ваш дизайн вы можетехотел бы использовать встроенные анонимные внутренние классы, вместо обеспечения реализации класса вашего интерфейса, если вы планируете использовать калькуляторы различных типов, возможно, с классом статического метода фабрики , где вы можете поместить весь свой тип SAMреализации:
public class Calculators {
public static BinaryCalculator getBasicCalculator(){
return new BinaryCalculator() {
@Override
public double addition(double numb1, double numb2) {
return numb1 + numb2;
}
};
}
public static BinaryCalculator getSofisticatedCalculator(){
return new BinaryCalculator() {
@Override
public double addition(double numb1, double numb2) {
//do any other sofisticated calculation
return numb1 + numb2;
}
};
}
}
Тогда вы можете просто сделать:
public static void main(String[] args) {
BinaryCalculator simple = Calculators.getBasicCalculator();
BinaryCalculator complex = Calculators.getSofisticatedCalculator();
double result;
result = simple.addition(10,11);
result = complex.addition(10,11);
}
Кроме того, если вам разрешено экспериментировать, вы можете попробовать JDK 8Lambda Preview , где вы могли бы написать реализацию своего калькулятора в виде выражения lamdba примерно так:
BinaryCalculator simple = (num1, num2) -> num1 + num2;
Или даже встроенный в метод, например
public class Pair {
private final double a;
private final double b;
public Pair(double a, double b){
this.a = a;
this.b = b;
}
public double calculateWith(BinaryCalculator calculator){
return calculator.addition(a,b);
}
}
ТогдаВы можете просто предоставить лямбда-реализацию для своего типа SAM следующим образом:
Pair p = new Pair(10,11);
double result = p.calculateWith( (num1, num2) -> num1 + num2 );
System.out.println(result);
Конечно, это всего лишь предварительнаявид JDK 8, но, эй, если вам позволено экспериментировать с последними функциями, это было бы действительно крутое решение: -)