2010-10-27 12 views
18

Effective Java dice "Considere proveer métodos de fábrica estáticas en lugar de constructores"¿Cómo usar los "métodos de fábrica estáticos" en lugar de los constructores?

Si usted tiene un

class A { 

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

¿Tiene sentido para proporcionar este método para la clase A, en lugar de llamar a nueva A() en el código.

+0

Posible duplicado: http://stackoverflow.com/questions/929021/what-are-static-factory-methods-in-java – oksayt

+8

+1 para leer Java efectivo – flash

Respuesta

21

Ver here para una buena exposición de las principales razones es posible que desee hacer esto. En resumen:

  1. nombrado "constructores".
  2. puede volver nula, en su caso.
  3. puede devolver una instancia de una clase derivada, si es apropiado.
  4. Reducir la verbosidad cuando una instancia de variables de tipos genéricos.

Otro motivo viene a la mente que el artículo no menciona: puede implementar lógica interesante para evitar la creación de objetos nuevos todo el tiempo (almacenamiento en caché basado en parámetros, reciclaje, etc.).

18

Para su ejemplo anterior, no tiene mucho sentido proporcionar un constructor estático. Y normalmente cuando proporcionas un constructor estático debes hacer que el constructor normal sea privado. De lo contrario, aún es posible crear una instancia con el constructor normal.

trato de explicar aquí con otro ejemplo, cuando se podría utilizar métodos de fábrica estáticas. Una de las ventajas es que puede dar a los métodos de fábrica los nombres comprensibles.

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) 

Otro ejemplo sería el patrón Singleton . Ahí quieres proporcionar solo una instancia. Así que esta es la razón por la cual usted hace el constructor privado y crear un método getInstance propia, donde se asegura de que siempre hay sólo una instancia disponible.

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 Method Pattern Wikipedia

2

El patrón Singleton con llamadas a métodos estáticos son un mejor diseño si ur en busca de una sola instancia .. debido a la naturaleza de reentrada estática de bloqueo .. proporcionar seguridad hilo y también evitando OUT- de orden escribe ...

Cuestiones relacionadas