¿Qué son los métodos de fábrica estáticos?


¿Qué es un método de "fábrica estática"?

Author: Tim Castelijns, 2009-05-30

14 answers

Evitamos proporcionar acceso directo a las conexiones de base de datos porque consumen muchos recursos. Así que usamos un método de fábrica estático getDbConnection que crea una conexión si estamos por debajo del límite. De lo contrario, intenta proporcionar una conexión "de repuesto", fallando con una excepción si no hay ninguna.

public class DbConnection{
   private static final int MAX_CONNS = 100;
   private static int totalConnections = 0;

   private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();

   private DbConnection(){
     // ...
     totalConnections++;
   }

   public static DbConnection getDbConnection(){

     if(totalConnections < MAX_CONNS){
       return new DbConnection();

     }else if(availableConnections.size() > 0){
         DbConnection dbc = availableConnections.iterator().next();
         availableConnections.remove(dbc);
         return dbc;

     }else {
         throw new NoDbConnections();
     }
   }

   public static void returnDbConnection(DbConnection dbc){
     availableConnections.add(dbc);
     //...
   }
}
 98
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-12 09:06:57

El patrón de método estático de fábrica es una forma de encapsular la creación de objetos. Sin un método factory, simplemente llamarías al constructor de la clase directamente: Foo x = new Foo(). Con este patrón, llamaría al método factory: Foo x = Foo.create(). Los constructores se marcan como privados, por lo que no se pueden llamar excepto desde dentro de la clase, y el método factory se marca como static para que pueda ser llamado sin tener primero un objeto.

Hay algunos ventajas de este patrón. Una es que la fábrica puede elegir entre muchas subclases (o implementadores de una interfaz) y devolver eso. De esta manera, el llamante puede especificar el comportamiento deseado a través de parámetros, sin tener que conocer o comprender una jerarquía de clases potencialmente compleja.

Otra ventaja es, como Matthew y James han señalado, controlar el acceso a un recurso limitado como las conexiones. Esta es una forma de implementar conjuntos de objetos reutilizables - en lugar de construir, usar y derribar un objeto, si la construcción y la destrucción son procesos costosos, podría tener más sentido construirlos una vez y reciclarlos. El método factory puede devolver un objeto instanciado existente y sin usar si tiene uno, o construir uno si el recuento de objetos está por debajo de algún umbral inferior, o lanzar una excepción o devolver null si está por encima del umbral superior.

Según el artículo en Wikipedia, múltiples métodos de fábrica también permiten diferentes interpretaciones de tipos de argumentos similares. Normalmente el constructor tiene el mismo nombre que la clase, lo que significa que solo puede tener un constructor con una firma dada. Las fábricas no están tan restringidas, lo que significa que puede tener dos métodos diferentes que aceptan los mismos tipos de argumentos:

Coordinate c = Coordinate.createFromCartesian(double x, double y)

Y

Coordinate c = Coordinate.createFromPolar(double distance, double angle)

Esto también se puede usar para mejorar la legibilidad, como señala Rasmus.

 424
Author: Jason Owen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-25 22:04:32

NOTA! "El método estático de fábrica es NO lo mismo que el Método de fábrica patrón" (c) Java efectivo, Joshua Bloch.

Método Factory: "Define una interfaz para crear un objeto, pero deja que las clases que implementan la interfaz decidan qué clase crear una instancia. El método Factory permite a una clase diferir la instanciación a subclases " (c) GoF.

"Static factory method es simplemente un método estático que devuelve una instancia de una clase. c) Eficaz Java, Joshua Bloch. Generalmente este método dentro de una clase en particular.

La diferencia:

La idea clave del método static factory es obtener el control sobre la creación de objetos y delegarlo del constructor al método static. La decisión del objeto a crear es como en la Fábrica Abstracta hecha fuera del método (en el caso común, pero no siempre). Mientras que la llave (!) la idea del Método Factory es delegar la decisión de qué instancia de clase crear dentro del Método Factory. Por ejemplo clásico La implementación de Singleton es un caso especial del método de fábrica estático. Ejemplo de métodos de fábrica estáticos comúnmente utilizados:

  • Valor de
  • getInstance
  • newInstance
 137
Author: Grygoriy Gonchar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-05 17:35:55

La legibilidad se puede mejorar mediante métodos de fábrica estáticos:

Comparar

public class Foo{
  public Foo(boolean withBar){
    //...
  }
}

//...

// What exactly does this mean?
Foo foo = new Foo(true);
// You have to lookup the documentation to be sure.
// Even if you remember that the boolean has something to do with a Bar
// you might not remember whether it specified withBar or withoutBar.

A

public class Foo{
  public static Foo createWithBar(){
    //...
  }

  public static Foo createWithoutBar(){
    //...
  }
}

// ...

// This is much easier to read!
Foo foo = Foo.createWithBar();
 65
Author: Rasmus Faber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-30 18:04:02
  • tienen nombres, a diferencia de los constructores, que pueden aclarar el código.
  • no es necesario crear un nuevo objeto en cada invocación - objetos se puede almacenar en caché y reutilizar, si es necesario.
  • puede devolver un subtipo de su tipo de retorno-en particular, puede devuelve un objeto cuya clase de implementación es desconocida para el autor de la llamada. Esta es una característica muy valiosa y ampliamente utilizada en muchos marcos que utilizan interfaces como el tipo de retorno de los métodos de fábrica estáticos.

Dehttp://www.javapractices.com/topic/TopicAction.do?Id=21

 18
Author: soldier.moth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-04 13:07:06

Todo se reduce a la mantenibilidad. La mejor manera de poner esto es cuando usas la palabra clave new para crear un objeto, estás acoplando el código que estás escribiendo a una implementación.

El patrón de fábrica le permite separar cómo crea un objeto de lo que hace con el objeto. Cuando crea todos sus objetos usando constructores, esencialmente está cableando el código que usa el objeto a esa implementación. El código que utiliza su objeto es " dependiente de" ese objeto. Esto puede no parecer un gran problema en la superficie, pero cuando el objeto cambia (piense en cambiar la firma del constructor o subclasificar el objeto) tiene que volver atrás y volver a cablear las cosas en todas partes.

Hoy en día las fábricas se han dejado de lado en gran medida a favor del uso de Inyección de dependencia porque requieren una gran cantidad de código de placa de caldera que resulta ser un poco difícil de mantener. La inyección de dependencia es básicamente equivalente a las fábricas, pero le permite para especificar cómo se conectan los objetos de forma declarativa (mediante configuración o anotaciones).

 16
Author: cwash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-28 22:04:13

Si el constructor de una clase es privado, entonces no puede crear un objeto para clase desde fuera de él.

class Test{
 int x, y;
 private Test(){
  .......
  .......
  }
}

No podemos crear un objeto para la clase above desde fuera de ella. Así que no se puede acceder a x, y desde fuera de la clase. Entonces, ¿de qué sirve esta clase?
Aquí está la respuesta: Método de FÁBRICA .
Agregue el siguiente método en la clase anterior

public static Test getObject(){
  return new Test();
}

Así que ahora puede crear un objeto para esta clase desde fuera de ella. Como el manera...

Test t = Test.getObject();

Por lo tanto, un método estático que devuelve el objeto de la clase ejecutando su constructor privado se llama FACTORY method
.

 10
Author: Santhosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-05 05:05:59

Pensé que agregaría algo de luz a este post sobre lo que sé. Usamos esta técnica extensamente en nuestro recent android project. En lugar de creating objects using new operator también puede usar static method para crear instancias de una clase. Listado de códigos:

//instantiating a class using constructor
Vinoth vin = new Vinoth(); 

//instantiating the class using static method
Class Vinoth{
  private Vinoth(){
  }
  // factory method to instantiate the class
  public static Vinoth getInstance(){
    if(someCondition)
        return new Vinoth();
  }
}

Los métodos estáticos admiten la creación condicional de objetos: Cada vez que invoque a un constructor, se creará un objeto, pero es posible que no desee eso. supongamos que desea comprobar alguna condición solo entonces desea crear un nuevo objeto.Usted no estaría creando una nueva instancia de Vinoth cada vez, a menos que tu condición esté satisfecha.

Otro ejemplo tomado de Java efectivo.

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

Este método traduce un valor primitivo booleano en una referencia de objeto booleano. El método Boolean.valueOf(boolean) nos ilustra, nunca crea un objeto. La capacidad de static factory methods para devolver el mismo objeto de repeated invocations permite a las clases mantener un control estricto sobre qué instancias existen en cualquier momento.

Static factory methods es que, a diferencia de constructors, pueden devolver un object de cualquier subtype de su tipo de retorno. Una aplicación de esta flexibilidad es que una API puede devolver objetos sin hacer públicas sus clases. Ocultar las clases de implementación de esta manera conduce a una API muy compacta.

Calendario.getInstance() es un gran ejemplo para lo anterior, crea dependiendo de laBuddhistCalendar, JapaneseImperialCalendar o por defecto uno Georgian.

Otro ejemplo que podría pensar es Singleton pattern, donde haces que tus constructores sean privados crea un propio {[17]]} método en el que te aseguras de que siempre hay una sola instancia disponible.

public class Singleton{
    //initailzed during class loading
    private static final Singleton INSTANCE = new Singleton();

    //to prevent creating another instance of Singleton
    private Singleton(){}

    public static Singleton getSingleton(){
        return INSTANCE;
    }
}
 8
Author: Thalaivar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-22 20:35:37

Un método de fábrica un método que abstrae la instanciación de un objeto. Por lo general, las fábricas son útiles cuando se sabe que se necesita una nueva instancia de una clase que implementa alguna interfaz, pero no se conoce la clase de implementación.

Esto es útil cuando se trabaja con jerarquías de clases relacionadas, un buen ejemplo de esto sería un kit de herramientas GUI. Puede simplemente hacer llamadas de código duro a los constructores para implementaciones concretas de cada widget, pero si alguna vez desea intercambiar un kit de herramientas por otro tendrías muchos lugares para cambiar. Mediante el uso de una fábrica se reduce la cantidad de código que tendría que cambiar.

 3
Author: Bryan Kyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-30 04:59:23

Una de las ventajas que se deriva de Static factory es que esa API puede devolver objetos sin hacer públicas sus clases. Esto conduce a una API muy compacta. En java esto se logra mediante la clase Collections que esconde alrededor de 32 clases lo que hace que la API de colección sea muy compacta.

 3
Author: Rakesh Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-04 17:33:04

Un método de fábrica estático es bueno cuando desea asegurarse de que solo una sola instancia va a devolver la clase concreta que se va a usar.

Por ejemplo, en una clase de conexión de base de datos, es posible que desee que solo una clase cree la conexión de base de datos, de modo que si decide cambiar de Mysql a Oracle, solo puede cambiar la lógica en una clase, y el resto de la aplicación utilizará la nueva conexión.

Si desea implementar la agrupación de bases de datos, entonces eso sería también se hará sin afectar el resto de la aplicación.

Protege el resto de la aplicación de los cambios que puede hacer a la fábrica, que es el objetivo.

La razón para que sea estática es si desea realizar un seguimiento de algún recurso limitado (número de conexiones de socket o manejadores de archivos), entonces esta clase puede realizar un seguimiento de cuántos se han pasado y devuelto, para que no agote el recurso limitado.

 1
Author: James Black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-30 06:15:33

Estática

Un miembro declarado con la palabra clave 'static'.

Métodos de fábrica

Métodos que crean y devuelven objetos nuevos.

En Java

El lenguaje de programación es relevante para el significado de 'static' pero no para la definición de 'factory'.

 1
Author: user207421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-11 01:17:58

La implementación de Java contiene clases de utilidades java.útil.Arrays y java.útil.Colecciones ambas contienen métodos de fábrica estáticos, ejemplos de ello y cómo usarlos :

También java.lang.String class have such static métodos de fábrica :

  • String.format(...), String.valueOf(..), String.copyValueOf(...)
 1
Author: Владимир Дворник,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-19 06:03:42

Una de las ventajas de los métodos de fábrica estáticos con constructor privado(la creación de objetos debe haber sido restringida para las clases externas para garantizar que las instancias no se creen externamente) es que puede crear clases controladas por instancias. Y las clases controladas por instancias garantizan que no existen dos instancias distintas iguales ( a. es igual a(b) si y solo si a = = b ) durante la ejecución de su programa, lo que significa que puede verificar la igualdad de objetos con == operador en lugar de es igual al método, según java efectivo.

La capacidad de los métodos de fábrica estáticos para devolver el mismo objeto desde las invocaciones repetidas permiten a las clases mantener un control estricto sobre qué instancias existen en cualquier momento. Se dice que las clases que hacen esto son instancia controlada. Hay varias razones para escribir clases controladas por instancias. El control de instancia permite a una clase garantizar que es un singleton (Punto 3) o no sustancial (Punto 4). Además, permite a una clase inmutable (Ítem 15) hacer la garantía que no existen dos instancias iguales: a. es igual a(b) si y solo si a = = b. Si una clase hace esta garantía, entonces sus clientes pueden usar el operador == en lugar del método equals(Object), que puede resultar en mejoras rendimiento. Los tipos de enumeración (artículo 30) proporcionan esta garantía.

De Java efectivo, Joshua Bloch (Ítem 1,página 6)

 0
Author: SherlockHomeless,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-02 14:00:16