patrones ejercicios diseño java design-patterns factory effective-java

diseño - ejercicios singleton java



Java efectivo por Joshua Bloch: Artículo 1-Método de fábrica estático (6)

  1. Las interfaces no pueden tener métodos estáticos, por lo que, por convención, los métodos de fábrica estáticos para una interfaz llamada Tipo se colocan en una clase no instanciable llamada Tipos .

    El punto es solo el plural ''s'' en "Tipo [s]" . Entonces, si su interfaz se llama Foo y desea crear una implementación llamada MyFoo entonces su fábrica con los métodos para crear instancias debería llamarse Foos por convención.

  2. Las clases de los objetos devueltos no son públicas.

    Esto significa que las clases de objetos devueltos por los métodos de fábrica tienen un modificador de visibilidad privado o predeterminado como en private class MyFoo{} para que no se puedan crear instancias de ninguna otra manera que no sean sus métodos de fábrica. Ya que no se puede construir un Objeto usando el new operador de una clase privada interna o de paquete fuera de su alcance (reflexión aparte).

p.ej:

public interface Foo{ //interface without plural ''s'' (question 1) public void bar(); } public abstract class Foos(){ // abstract factory with plural ''s'' (question 1) public static Foo createFoo(){ return new MyFoo(); } private class MyFoo implements Foo{ // a non visible implementation (question 2) public void bar(){} } }

Estoy leyendo el Effective Java por Joshua Bloch y tengo una pregunta sobre el Static Factory Method .

Cita [Bloch, p.7]

Las interfaces no pueden tener métodos estáticos, por lo que, por convención, los métodos de fábrica estáticos para una interfaz llamada Tipo se colocan en una clase no instanciable llamada Tipos. Por ejemplo, el Java Collections Framework, proporciona colecciones no modificables, colecciones sincronizadas y similares. Casi todas estas implementaciones se exportan a través de métodos de fábrica estáticos en una clase no institucional (java.util.Collections). Las clases de los objetos devueltos no son públicas.

De acuerdo. Cuando miro el código fuente, veo la interfaz java.util.Collections y la clase java.util.Collections con un constructor privado (clase no instanciable). y veo que las Colecciones de clase no instanciables tienen todos los métodos estáticos, como lo dijo Bloch. Pero no veo la conexión entre las dos clases como dijo Bloch

Las interfaces no pueden tener métodos estáticos, por lo que, por convención, los métodos de fábrica estáticos para una interfaz llamada Tipo se colocan en una clase no instanciable llamada Tipos.

  1. ¿Alguien puede señalar lo obvio para mí?

  2. que significa cuando dijo

Las clases de los objetos devueltos no son públicas.

Aquí es donde obtengo las fuentes java: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av=f


1) No entiendo tu pregunta aquí. Collection es la interfaz y Collections tiene algunos métodos de fábrica como emptyList

2) Por ejemplo, la instancia de lista que devuelve Collection.emptyList es una instancia de una clase privada que implementa la interfaz de List .


Así que tomemos por ejemplo Collections.unmodifiableList(...) . Devuelve alguna implementación de lista. Pero el nombre de la clase de implementación es irrelevante. Además, dicha clase solo se construye a través del método de fábrica estática.


Digamos que tiene una interfaz llamada List y desea utilizar el método de fábrica estático para crear diferentes tipos de listas. No puede definir los métodos de fábrica estáticos en la interfaz de List porque es una interfaz. Entonces, lo que tienes que hacer es tener una clase que devuelva instancias de clases que implementen List

public class ListFactory{ private ListFactory(){} public static List makeArrayList(){...} public static List makeLinkedList(){...} public static List makeCrazyList(){...} }

No puedes hacer esto

public interface List{ public static List makeArrayList(); public static List makeLinkedList(); public static List makeCrazyList(); }

Desde la List es la interfaz.


Simplemente significa que el tipo de retorno de los métodos de fábrica estáticos en Collections (y otras clases similares) son tipos de interfaz (por ejemplo, List ) en lugar de clases de implementación específicas (por ejemplo, java.util.Collections.UnmodifiableList ), que no son visibles para los usuarios ya que eso solo complicaría las cosas y aumentaría el tamaño de la API.


public interface Foo static public class Factory public Foo create(){..} Foo foo = Foo.Factory.create();