Как использовать "Static factory методы" вместо конструкторов?
Эффективный java говорит
"Рассмотрите возможность предоставления статических factory методов вместо конструкторов"
Если у вас есть
class A {
public static A getInstance() {
return new A();
}
}
Имеет ли смысл предоставлять этот метод для класса A, а не вызывать новый код A() в коде.
Ответы
Ответ 1
Смотрите здесь для приятного изложения основных причин, по которым вы, возможно, захотите это сделать. Вкратце:
- Именованные "конструкторы".
- Может возвращать нуль, если это необходимо.
- Может возвращать экземпляр производного класса, если это необходимо.
- Уменьшить многословие при копировании переменных общих типов.
Другая причина заключается в том, что статья не упоминает: может реализовать интересную логику, чтобы не создавать новые объекты все время (кеширование на основе параметров, переработка и т.д.).
Ответ 2
Для вашего примера выше не имеет смысла предоставлять статический конструктор. И обычно, когда вы предоставляете статический конструктор, вы должны сделать обычный конструктор закрытым. В противном случае все еще возможно создать экземпляр с обычным конструктором.
Я попытаюсь объяснить здесь другой пример, когда вы можете использовать статические методы factory. Одно из преимуществ заключается в том, что вы можете дать понятным именам методы factory.
class Complex {
public static Complex fromCartesian(double real, double imag) {
return new Complex(real, imag);
}
public static Complex fromPolar(double modulus, double angle) {
return new Complex(modulus * cos(angle), modulus * sin(angle));
}
private Complex(double a, double b) {
//...
}
}
Complex c = Complex.fromPolar(1, pi)
Или другим примером может быть Singleton Pattern. Там вы не будете предоставлять только один экземпляр. Вот почему вы делаете конструктор закрытым и создаете собственный метод getInstance, где вы убедитесь, что всегда доступен только один экземпляр.
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {
}
// synchronized keyword has been removed from here
public static Singleton getSingleton() {
if(singleton==null) {
synchronized(Singleton.class){
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
Factory Шаблон метода Википедия
Ответ 3
Шаблон Singleton со статическими вызовами методов является лучшим дизайном, если ур ищет один экземпляр.. из-за реентерабельности блокировки статики. Обеспечение безопасности потока, а также исключение записи из-за порядка.