2011-04-28 24 views
6

Estaba pasando por Java efectivo y leyendo métodos estáticos de fábrica para crear objetos. Su capítulo 2, punto 1. Hay en la ventaja no. 3, el escritor ha mencionado como¿Qué es el marco basado en interfaz?

Ocultar las clases de implementación de esta manera puede dar lugar a una API muy compacta. Esta técnica se presta a marcos basados ​​en interfaz, donde las interfaces proporcionan tipos de retorno naturales para métodos de fábrica estáticos.

No pude entender lo que son los marcos basados ​​en interfaz?

Respuesta

6

Tal vez reformular un poco ayudaría:

un marco basado en la interfaz es un fr Un método que le da al usuario/cliente acceso lib a las interfaces solo mientras realmente entrega clases implementando esas interfaces.

El beneficio de este enfoque consiste en darle al implementador el control total sobre la implementación y darle al cliente una API estable al mismo tiempo.

Encontré un ejemplo últimamente, donde el cliente obtiene un XmlProcessor de un método API. Dentro del marco, hay tres implementaciones totalmente diferentes de este procesador: un DomXmlProcessor, SaxXmlProcessor y un VtdXmlProcessor. Los detalles de las implementaciones individuales no son de interés para el cliente y se pueden cambiar en cualquier momento.

+0

lo siento editado la respuesta incorrecta :) – Bozho

+0

@Bozho seguir adelante, la mía podría usar también :) – kostja

+0

¡genial! ¡Un ejemplo vale más que mil explicaciones! – dellasavia

4

Los marcos basados ​​en interfaz son aquellos marcos diseñados con Interface y su implementación.

Collection framework es un buen ejemplo de marcos basados ​​en interfaz.

Ocultación de clases de implementación de esta manera pueden conducir a una API muy compacto

Usted acaba de crear una interfaz

interface Animal{ 
public void eat();//hiding the implementation 
public Animal getAnimalInstance();//factory method 
} 

su implementador se hará cargo de la implementación.

su consumidor API direcrtly usar interfaz como lo hacemos en la colección

List<String> list = new ArrayList<String>(); 

también vemos

+2

No creo que haya explicado exactamente qué es el marco basado en interfaz. Acabas de dar una guinda sin el pastel. –

+0

¿la interfaz permite declarar métodos estáticos? – darkapple

+0

Estoy un poco confundido. Pero este hilo sugiere que no podemos. http://stackoverflow.com/questions/21817/why-cant-i-declare-static-methods-in-an-interface – darkapple

1

marcos que exponen principalmente interfaces para sus usuarios (en lugar de implementaciones concretas)

Ya que menciona Bloch, voy a dar un ejemplo con el marco de las colecciones. Puede ver que la clase Collections tiene synchronizedX(..), unmodifiableX(..), singletonX(..) métodos. Estos son métodos de fábrica estáticos, y hay muchos de ellos, pero solo devuelven interfaces: List, Map, Set, SortedMap. Detrás de escena, hay toneladas de implementaciones que no necesita saber.

Otro ejemplo (pero sin el foco en fábricas estáticas) es la API de JDBC.Casi no hay clases allí - Connection, Stetement, PreparedStatement, ResultSet, etc. son todas las interfaces. Esto permite que existan muchas implementaciones para diferentes bases de datos sin que el usuario haga la diferencia. (Imagínese si tuviera que usar en sus clases de código como MySQLStatement, OracleConnection, etc.)

1

Cuando diseña software, existen principios básicos de diseño para ayudar a administrar la complejidad involucrada en una tarea tan compleja.

Uno de estos principios básicos es subdividir los problemas complejos en más pequeños, más fáciles de administrar y comprender.

una interfaz es de hecho un contrato. Define los servicios a los que una clase debe ajustarse y cómo usarlos. La interfaz oculta los detalles de implementación de una o varias implementaciones posibles del contrato.

Una aplicación Java típica se diseñará con interfaces para modelar los contratos principales proporcionados por las diferentes partes del software. El detalle de las implementaciones está oculto y permite reducir la complejidad.

Para ser más concreto, digamos que diseñe una aplicación de contabilidad. Todas las cuentas ofrecen los mismos servicios básicos: conseguir el equilibrio actual, el crédito o retirar dinero, solicitar un resumen de las operaciones anteriores. Se puede definir una interfaz así todo tipo de cuenta se ajustará a:

public interface Account { 

    double getBalance(); 

    void credit(double amount); 

    void withdraw(double amount); 

    List<Operation> getOperations(Date startDate, Date endDate); 

} 

Con esta definición, es fácil, por ejemplo, para proporcionar una interfaz de usuario que permite a un usuario gestionar su cuentas. De hecho, existen diferencias entre la cuenta de cheques y la cuenta de la tarjeta de crédito. Tendrá que administrar de forma diferente la cuenta presente directamente en la base de datos del banco, o las cuentas distantes de otros bancos. Una de ellas será una operación directa, otra sería utilizar un protocolo de red de algún tipo para realizar la operación.

Pero desde su punto de vista, todo lo que necesita es que el contrato se haya cumplido. Y puedes trabajar en cuentas. Los detalles sobre cómo se realiza una operación de cuenta específica no son su problema.

Ésta es elegante y agradable, pero siguen siendo un problema. ¿Cómo se obtienen sus cuentas? Es una cuenta de descuento de otro banco seguramente diferente de una cuenta local. El código es diferente. Y la forma de crearlo también. Para la cuenta lejano, es necesario, por ejemplo, la dirección de red a otro servidor del banco ... El otro podría requerir una base de datos ID.

Cada vez que necesite tener una cuenta, puede recrearla explícitamente u obtenerla con todos los detalles de implementación. Obtener una cuenta distante o una cuenta local es muy diferente.

Aislar esta complejidad en una parte de su aplicación es una buena práctica. Es conforme subdividir la tarea compleja en tareas más pequeñas y simples.

He dado el ejemplo de la aplicación de contabilidad, pero de hecho podemos ser más generales. Crear objetos y recuperar objetos ya creados es un problema muy común en cualquier software. Entonces tenemos "buenas maneras" comunes de hacerlo de una manera limpia y sostenible.

El código que gestiona la complejidad de crear para obtener un objeto específico, ocultando de hecho cómo se construyó o se le dio el objeto es una fábrica llamada.

La combinación de la fábrica (que ocultan la complejidad de la creación/la búsqueda de objetos) y la interfaz (que ocultan la complejidad de cada implementación de los objetos), si la base de la herramienta programadores Java utilizan para gestionar la complejidad del software.

Cuestiones relacionadas