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.
lo siento editado la respuesta incorrecta :) – Bozho
@Bozho seguir adelante, la mía podría usar también :) – kostja
¡genial! ¡Un ejemplo vale más que mil explicaciones! – dellasavia