Как использовать «Статические методы фабрики» вместо конструкторов?

17

Эффективный java говорит «Рассмотрите возможность предоставления статических заводских методов вместо конструкторов»

Если у вас есть

 class A {

     public static A getInstance() {
        return new A();
     }
 }

Имеет ли смысл предоставлять этот метод для класса A, а не вызывать новый код A () в коде.

    
задан kal 27.10.2010 в 04:47
источник

3 ответа

20

См. здесь для приятного изложения основных причин, по которым вы, возможно, захотите это сделать. Вкратце:

  1. Именованные "конструкторы".
  2. Может возвращать нуль, если это необходимо.
  3. Может возвращать экземпляр производного класса, если это необходимо.
  4. Уменьшить многословие при копировании переменных общих типов.

Другая причина заключается в том, что статья не упоминает: может реализовать интересную логику, чтобы не создавать новые объекты все время (кеширование на основе параметров, переработка и т. д.).

    
ответ дан Marcelo Cantos 27.10.2010 в 04:52
источник
18

Для вашего примера выше не имеет смысла предоставлять статический конструктор. И обычно, когда вы предоставляете статический конструктор, вы должны сделать обычный конструктор закрытым. В противном случае все еще возможно создать экземпляр с обычным конструктором.

Я попытаюсь объяснить здесь еще один пример, когда вы можете использовать статические методы фабрики. Одно из преимуществ заключается в том, что вы можете дать фабричным методам понятные имена.

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;
    }

}

Заводской шаблон метода Википедия

    
ответ дан Prine 27.10.2010 в 04:56
источник
2

Шаблон Singleton со статическими вызовами методов является лучшим дизайном, если ур ищет один экземпляр .. из-за реентерабельности блокировки статики. Обеспечение безопасности потока, а также исключение записи из-за порядка.

    
ответ дан bala singareddy 27.10.2010 в 05:34
источник