titledborder poner borde java factory-pattern

java - poner - ejemplos de métodos de fábrica Vs métodos de fábrica estáticos



set border java (4)

¿No pueden todos los métodos de fábrica ser estáticos? ¿Algo que produce un producto necesita estado? ¿Cuándo es apropiado elegir una fábrica de instancias o un método de fábrica estático? ¿Me puede dar ejemplos que diferencien a los dos?


Depende, por ejemplo, puede tener una fábrica que solo producirá una cierta cantidad de objetos, en cuyo caso habrá un estado asociado. En su mayor parte, los métodos de fábrica pueden ser estáticos siempre que no dependan de variables no estáticas (como variables globales no estáticas y similares) para su creación. También tiende a diferenciar diferentes fábricas para diferentes partes de una aplicación, por lo que dependiendo de si hay un estado o no en su fábrica es lo que usted debería hacer. No está establecido que todos los métodos de fábrica deberían ser estáticos. Compruebe qué situación se aplica a usted y escríbalo apropiadamente.

Otra consideración es la palabra clave estática, esto hace que lo que sea estático sea instanciado solo una vez en la memoria, pero un inconveniente es que siempre reside en la memoria del proceso (lo que aumenta el tamaño del conjunto de trabajo). Esto puede ser algo que no desea, ya que su fábrica podría tener una localidad muy alta en ciertas áreas y, de otro modo, simplemente estaría consumiendo memoria en otro lugar, pero esto generalmente es un problema de optimización que debería considerarse solo si el problema de la memoria la presión en su aplicación surge.


Mi preferencia actual es hacer que los métodos de fábrica no sean estáticos por el bien de una prueba más fácil. No puede cambiar una llamada de método de fábrica estático en tiempo de ejecución, mientras que si pudiera proporcionar una implementación de fábrica al objeto, entonces podría probarlo más a fondo ya que tengo más control sobre el contexto y el gráfico de objetos.


Si devuelve un Singleton de su fábrica, necesitará asegurarse de tener solo una instancia, si va a crear una nueva instancia cada vez que llama a la fábrica y luego lo convierte en estático.


Suponiendo que, por "método de fábrica de instancias", realmente está diciendo acerca del "método de fábrica" ​​de GoF, el término "método de fábrica estático" lo describe Joshua Bloch en su libro "Java efectivo". Busco en Google a través de estos sitios:

Espero que haya ayudado a hacer la diferencia un poco más clara.

Siguiendo el consejo de Marvo:

  • Método de fábrica como se indica en GoF:

    define una interfaz para crear un objeto, pero deja que las subclases decidan qué clase instanciar. El método de fábrica permite que una clase difiera la instanciación a subclases.

Ejemplo (código de Java):

public abstract class Product { ... } public class ConcreteProduct extends Product { ... } public abstract class Creator { public void anOperation() { ... product = factoryMethod(); ... } public abstract Product factoryMethod(); } public class ConcreteCreator extends Creator { public Product factoryMethod() { return new ConcreteProduct(); } }

  • Método estático de fábrica como se establece en Java efectivo:

    Una clase puede proporcionar un método público de fábrica estática, que es simplemente un método estático que devuelve una instancia de la clase. (...) Una ventaja de los métodos de fábrica estáticos es que, a diferencia de los constructores, tienen nombres. (...) Una segunda ventaja de los métodos de fábrica estáticos es que, a diferencia de los constructores, no están obligados a crear un nuevo objeto cada vez que se invocan. (...) Una tercera ventaja de los métodos de fábrica estáticos es que, a diferencia de los constructores, pueden devolver un objeto de cualquier subtipo de su tipo de devolución. (...) La principal desventaja de proporcionar solo métodos de fábrica estáticos es que las clases sin constructores públicos o protegidos no se pueden subclasificar.

Ejemplo (código de Java):

public class Boolean { ... public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } ... }