ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

La estructura típica del patrón Abstract Factory

navi84719 de Noviembre de 2014

2.853 Palabras (12 Páginas)235 Visitas

Página 1 de 12

Abstract Factory

>Contexto y Problema

Contexto: Debemos crear diferentes objetos, todos pertenecientes a la misma familia. Por ejemplo: las bibliotecas para crear interfaces gráficas suelen utilizar este patrón y cada familia sería un sistema operativo distinto. Así pues, el usuario declara un Botón, pero de forma más interna lo que está creando es un BotónWindows o un BotónLinux, por ejemplo.

El problema que intenta solucionar este patrón es el de crear diferentes familias de objetos.

El patrón Abstract Factory está aconsejado cuando se prevé la inclusión de nuevas familias de productos, pero puede resultar contraproducente cuando se añaden nuevos productos o cambian los existentes, puesto que afectaría a todas las familias creadas.

>Aspecto estático

La estructura típica del patrón Abstract Factory es la siguiente:

• Cliente: La clase que llamará a la factoría adecuada ya que necesita crear uno de los objetos que provee la factoría, es decir, Cliente lo que quiere es obtener una instancia de alguno de los productos (ProductoA, ProductoB).

• AbstractFactory: Es la definición de la interfaces de las factorías. Debe de proveer un método para la obtención de cada objeto que pueda crear. ("crearProductoA()" y "crearProductoB()")

• Factorías Concretas: Estas son las diferentes familias de productos. Provee de la instancia concreta de la que se encarga de crear. De esta forma podemos tener una factoría que cree los elementos gráficos para Windows y otra que los cree para Linux, pudiendo poner fácilmente (creando una nueva) otra que los cree para MacOS, por ejemplo.

• Producto abstracto: Definición de las interfaces para la familia de productos genéricos. En el diagrama son "ProductoA" y "ProductoB". En un ejemplo de interfaces gráficas podrían ser todos los elementos: Botón, Ventana, Cuadro de Texto, Combo... El cliente trabajará directamente sobre esta interfaz, que será implementada por los diferentes productos concretos.

• Producto concreto: Implementación de los diferentes productos. Podría ser por ejemplo "BotónWindows" y "BotónLinux". Como ambos implementan "Botón" el cliente no sabrá si está en Windows o Linux, puesto que trabajará directamente sobre la superclase o interfaz.

Singleton

El patrón de diseño singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.

Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.

El patrón singleton se implementa creando en nuestra clase un método que crea una instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con atributos como protegido o privado).

La instrumentación del patrón puede ser delicada en programas con múltiples hilos de ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo y esta no existe todavía, sólo uno de ellos debe lograr crear el objeto. La solución clásica para este problema es utilizar exclusión mutua en el método de creación de la clase que implementa el patrón.

Las situaciones más habituales de aplicación de este patrón son aquellas en las que dicha clase controla el acceso a un recurso físico único (como puede ser el ratón o un archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible para todos los demás objetos de la aplicación.

El patrón singleton provee una única instancia global gracias a que:

• La propia clase es responsable de crear la única instancia.

• Permite el acceso global a dicha instancia mediante un método de clase.

• Declara el constructor de clase como privado para que no sea instanciable directamente.

>Ejemplo de implementación en JAVA:

public class Singleton {

private static Singleton INSTANCE = new Singleton();

// El constructor privado no permite que se genere un constructor por defecto.

// (con mismo modificador de acceso que la definición de la clase)

private Singleton() {}

public static Singleton getInstance() {

return INSTANCE;

}

}

Adapter

El patrón Adapter (Adaptador) se utiliza para transformar una interfaz en otra, de tal modo que una clase que no pudiera utilizar la primera, haga uso de ella a través de la segunda.

Usar el patrón Adapter cuando:

• Se desea usar una clase existente, y su interfaz no se iguala con la necesitada.

• Cuando se desea crear una clase reusable que coopera con clases no relacionadas, es decir, las clases no tienen necesariamente interfaces compatibles.

>Estructura

>Participantes

• Target define la interfaz específica del dominio que Client usa.

• Client colabora con la conformación de objetos para la interfaz Target.

• Adaptee define una interfaz existente que necesita adaptarse

• Adapter adapta la interfaz de Adaptee a la interfaz Target

>Implementación

package Structural_patterns;

public class AdapterWrapperPattern {

public static void main(String args[]){

Guitar eGuitar = new ElectricGuitar();

eGuitar.onGuitar();

eGuitar.offGuitar();

Guitar eAGuitar = new ElectricAcousticGuitar();

eAGuitar.onGuitar();

eAGuitar.offGuitar();

}

public abstract class Guitar{

abstract public void onGuitar();

abstract public void offGuitar();

}

public class ElectricGuitar extends Guitar{

public void onGuitar() {

System.out.println("Playing Guitar");

}

public void offGuitar() {

System.out.println("I'm tired to play the guitar");

}

}

/**

* Class to Adapter/Wrapper

*/

public class AcousticGuitar{

public void play(){

System.out.println("Playing Guitar");

}

public void leaveGuitar(){

System.out.println("I'm tired to play the guitar");

}

}

/**

* we Adapter/Wrapper AcousticGuitar into

* ElectricAcousticGuitar to adapt into the GuitarModel

*/

public class ElectricAcousticGuitar extends Guitar{

AcousticGuitar acoustic = new AcousticGuitar();

public void onGuitar() {

acoustic.play();

}

public void offGuitar() {

acoustic.leaveGuitar();

}

}

}

Decorator

El patrón Decorator responde a la necesidad de añadir dinámicamente funcionalidad a un Objeto. Esto nos permite no tener que crear sucesivas clases que hereden de la primera incorporando la nueva funcionalidad, sino otras que la implementan y se asocian a la primera.

Un ejemplo para poder ver la aplicabilidad del patrón decorador podría ser el siguiente:

• Disponemos de una herramienta para crear interfaces gráficas, que permite añadir funcionalidades como bordes o barras de desplazamiento a cualquier componente de la interfaz.

• Una posible solución sería utilizar la herencia para extender las responsabilidades de la clase. Si optamos por esta solución, estaríamos haciendo un diseño inflexible (estático), ya que el cliente no puede controlar cuando y como decorar el componente con esa propiedad.

• La solución está en encapsular dentro de otro objeto, llamado Decorador, las nuevas responsabilidades. El decorador redirige las peticiones al componente y, además, puede realizar acciones adicionales antes y después de la redirección. De este modo, se pueden añadir decoradores con cualidades añadidas recursivamente.

>Aplicabilidad

• Añadir objetos individuales de forma dinámica y transparente

• Responsabilidades de un objeto pueden ser retiradas

• Cuando la extensión mediante la herencia no es viable

• Hay una necesidad de extender la funcionalidad de una clase, pero no hay razones para extenderlo a través de la herencia.

• Existe la necesidad de extender dinámicamente la funcionalidad de un objeto y quizás quitar la funcionalidad extendida.

>Participantes

• Componente

Define la interfaz para los objetos que pueden tener responsabilidades añadidas.

• Componente Concreto

Define un objeto al cual se le pueden agregar responsabilidades adicionales.

• Decorador

Mantiene una referencia al componente asociado. Implementa la interfaz de la superclase Componente delegando en el componente asociado.

• Decorador Concreto

Añade responsabilidades al componente.

>Implementacion en JAVA

public abstract class Componente{

abstract public void operacion();

}

public class ComponenteConcreto extends Componente{

public void operacion(){

System.out.println("ComponenteConcreto.operacion()");

...

Descargar como (para miembros actualizados) txt (19 Kb)
Leer 11 páginas más »
Disponible sólo en Clubensayos.com