Académique Documents
Professionnel Documents
Culture Documents
>Contexto y Problema
Contexto: Debemos crear diferentes objetos, todos pertenecientes a la misma familia.
Por ejemplo: las bibliotecas para crear interfaces grficas suelen utilizar este patrn y
cada familia sera un sistema operativo distinto. As pues, el usuario declara un Botn,
pero de forma ms interna lo que est creando es un BotnWindows o un BotnLinux,
por ejemplo.
El problema que intenta solucionar este patrn es el de crear diferentes familias de
objetos.
El patrn Abstract Factory est aconsejado cuando se prev la inclusin de nuevas
familias de productos, pero puede resultar contraproducente cuando se aaden
nuevos productos o cambian los existentes, puesto que afectara a todas las familias
creadas.
>Aspecto esttico
Cliente: La clase que llamar a la factora adecuada ya que necesita crear uno de
los objetos que provee la factora, es decir, Cliente lo que quiere es obtener una
instancia de alguno de los productos (ProductoA, ProductoB).
Singleton
El patrn de diseo singleton (instancia nica) est diseado para restringir la creacin de
objetos pertenecientes a una clase o el valor de un tipo a un nico objeto.
Su intencin consiste en garantizar que una clase slo tenga una instancia y proporcionar
un punto de acceso global a ella.
El patrn singleton se implementa creando en nuestra clase un mtodo que crea una
instancia del objeto slo si todava 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 instrumentacin del patrn puede ser delicada en programas con mltiples hilos de
ejecucin. Si dos hilos de ejecucin intentan crear la instancia al mismo tiempo y esta no
existe todava, slo uno de ellos debe lograr crear el objeto. La solucin clsica para este
problema es utilizar exclusin mutua en el mtodo de creacin de la clase que implementa
el patrn.
Las situaciones ms habituales de aplicacin de este patrn son aquellas en las que dicha
clase controla el acceso a un recurso fsico nico (como puede ser el ratn o un archivo
abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible para todos
los dems objetos de la aplicacin.
Adapter
El patrn 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 travs de la segunda.
Usar el patrn Adapter cuando:
Cuando se desea crear una clase reusable que coopera con clases no relacionadas,
es decir, las clases no tienen necesariamente interfaces compatibles.
>Estructura
>Participantes
>Implementacin
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();
}
Decorator
El patrn Decorator responde a la necesidad de aadir dinmicamente 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 patrn decorador podra ser el siguiente:
Disponemos de una herramienta para crear interfaces grcas, que permite aadir
funcionalidades como bordes o barras de desplazamiento a cualquier componente de
la interfaz.
Una posible solucin sera utilizar la herencia para extender las responsabilidades de
la clase. Si optamos por esta solucin, estaramos haciendo un diseo inflexible
(esttico), ya que el cliente no puede controlar cuando y como decorar el componente
con esa propiedad.
La solucin est en encapsular dentro de otro objeto, llamado Decorador, las nuevas
responsabilidades. El decorador redirige las peticiones al componente y, adems,
puede realizar acciones adicionales antes y despus de la redireccin. De este modo,
se pueden aadir decoradores con cualidades aadidas recursivamente.
>Aplicabilidad
Hay una necesidad de extender la funcionalidad de una clase, pero no hay razones
para extenderlo a travs de la herencia.
>Participantes
Componente
Dene la interfaz para los objetos que pueden tener responsabilidades aadidas.
Componente Concreto
Decorador
Decorador Concreto
>Implementacion en JAVA
public abstract class Componente{
abstract public void operacion();
}
public class ComponenteConcreto extends Componente{
public void operacion(){
System.out.println("ComponenteConcreto.operacion()");
}
}
public abstract class Decorador extends Componente{
private Componente _componente;
public Decorador(Componente componente){
_componente = componente;
}
public void operacion(){
_componente.operacion();
}
}
public class DecoradorConcretoA extends Decorador{
private String _propiedadAadida;
public DecoradorConcretoA(Componente componente){
super(componente);
}
public void operacion(){
super.operacion();
_propiedadAadida = "Nueva propiedad";
System.out.println("DecoradorConcretoA.operacion()");
}
}
public class DecoradorConcretoB extends Decorador{
public DecoradorConcretoB(Componente componente){
super(componente);
}
public void operacion(){
super.operacion();
comportamientoAadido();
System.out.println("DecoradorConcretoB.operacion()");
}
public void comportamientoAadido(){
System.out.println("Comportamiento B aadido");
}
}
public class Cliente{
public static void main(String[] args){
ComponenteConcreto c = new ComponenteConcreto();
DecoradorConcretoA d1 = new DecoradorConcretoA(c);
DecoradorConcretoB d2 = new DecoradorConcretoB(d1);
d2.operacion();
}
}
Facade
El patrn fachada viene motivado por la necesidad de estructurar un entorno de
programacin y reducir su complejidad con la divisin en subsistemas, minimizando las
comunicaciones y dependencias entre stos.
Se aplicar el patrn fachada cuando se necesite proporcionar una interfaz simple para un
subsistema complejo, o cuando se quiera estructurar varios subsistemas en capas, ya que
las fachadas seran el punto de entrada a cada nivel. Otro escenario proclive para su
aplicacin surge de la necesidad de desacoplar un sistema de sus clientes y de otros
subsistemas, hacindolo ms independiente, portable y reutilizable (esto es, reduciendo
dependencias entre los subsistemas y los clientes).
>Estructura
>Participantes
>Ventajas e Inconvenientes
La principal ventaja del patrn fachada consiste en que para modificar las clases
de los subsistemas, slo hay que realizar cambios en la interfaz/fachada, y los
clientes pueden permanecer ajenos a ello. Adems, y como se mencion
anteriormente, los clientes no necesitan conocer las clases que hay tras dicha
interfaz.
Observer
Observador (en ingls: Observer) es un patrn de diseo que define una dependencia del
tipo uno-a-muchos entre objetos, de manera que cuando uno de los objetos cambia su
estado, notifica este cambio a todos los dependientes. Se trata de un patrn de
comportamiento (existen de 3 tipos: Creacin, Estructurales y de Comportamiento), es
decir, est relacionado con algoritmos de funcionamiento y asignacin
de responsabilidades a clases y objetos. Los patrones de comportamiento describen no
solamente estructuras de relacin entre objetos o clases sino tambin esquemas de
comunicacin entre ellos y se pueden clasificar en funcin de que trabajen
con clases (Mtodo Plantilla) u objetos (Cadena de Responsabilidad, Comando, Iterador,
Recuerdo, Observador, Estado, Estrategia, Visitante).
La variacin de la encapsulacin es la base de muchos patrones de comportamiento, por lo
que cuando un aspecto de un programa cambia frecuentemente, estos patrones definen un
objeto que encapsula dicho aspecto. Los patrones definen una clase abstracta que
describe la encapsulacin del objeto.
El patrn Observer es la clave del patrn de arquitectura Modelo Vista
Controlador (MVC). De hecho el patrn fue implementado por primera vez
en Smalltalk's MVC basado en un framework de interfaz. Este patrn est implementado
en numerosos libreras y sistemas, incluyendo todos los toolkits de GUI.
>Objetivo
>Aplicabilidad
>Estructura
>Participantes
A continuacin tenemos a los participantes de forma desglosada:
Sujeto (Subject):
El sujeto concreto proporciona una interfaz para agregar (attach) y eliminar
(update/notify).
Sujeto Concreto (ConcreteSubject):
Mantiene el estado de inters para los observadores concretos y los
notifica cuando cambia su estado. No tienen porque ser elementos de la
misma jerarqua.
Observador Concreto (ConcreteObserver):
Mantiene una referencia al sujeto concreto e implementa la interfaz de
actualizacin, es decir, guardan la referencia del objeto que observan, as
en caso de ser notificados de algn cambio, pueden preguntar sobre este
cambio.
>Implementacin en JAVA
Clase java.util.Observable
addObserver(o Observer)
deleteObserver(o Observer)
notifyObserver()
notifyObservers(Object data)
Interface java.util.Observer
void update (Observable o, Object data)
Strategy
El patrn Estrategia (Strategy) es un patrn de diseo para el desarrollo de software. Se
clasifica como patrn de comportamiento porque determina como se debe realizar el
intercambio de mensajes entre diferentes objetos para resolver una tarea. El patrn
estrategia permite mantener un conjunto de algoritmos de entre los cuales el objeto cliente
puede elegir aquel que le conviene e intercambiarlo dinmicamente segn sus
necesidades.
>Aplicabilidad
Cualquier programa que ofrezca un servicio o funcin determinada, que pueda ser
realizada de varias maneras, es candidato a utilizar el patrn estrategia. Puede
haber cualquier nmero de estrategias y cualquiera de ellas podr ser
intercambiada por otra en cualquier momento, incluso en tiempo de ejecucin. Si
muchas clases relacionadas se diferencian nicamente por su comportamiento, se
crea una superclase que almacene el comportamiento comn y que har de
interfaz hacia las clases concretas.
Si un algoritmo utiliza informacin que no deberan conocer los clientes, la
utilizacin del patrn estrategia evita la exposicin de dichas estructuras. Aplicando
el patrn a una clase que defina mltiples comportamientos mediante instrucciones
condicionales, se evita emplear estas instrucciones, moviendo el cdigo a clases
independientes donde se almacenar cada estrategia.
>Participantes
Contexto (Context) : Es el elemento que usa los algoritmos, por tanto, delega en la
jerarqua de estrategias. Configura una estrategia concreta mediante una
referencia a la estrategia necesaria. Puede definir una interfaz que permita a la
estrategia el acceso a sus datos en caso de que fuese necesario el intercambio de
informacin entre el contexto y la estrategia. En caso de no definir dicha interfaz, el
contexto podra pasarse a s mismo a la estrategia como parmetro.
Estrategia (Strategy): Declara una interfaz comn para todos los algoritmos
soportados. Esta interfaz ser usada por el contexto para invocar a la estrategia
concreta.
EstrategiaConcreta (ConcreteStrategy): Implementa el algoritmo utilizando la
interfaz definida por la estrategia.
>Consecuencias
La herencia puede ayudar a factorizar las partes comunes de las familias de
algoritmos (sustituyendo el uso de bloques de instrucciones condicionales). En este
contexto es comn la aparicin conjunta de otros patrones como el patrn plantilla.
El uso del patrn proporciona una alternativa a la extensin de contextos, ya que
puede realizarse un cambio dinmico de estrategia.
Los clientes deben conocer las diferentes estrategias y debe comprender las
posibilidades que ofrecen.
Como contrapartida, aumenta el nmero de objetos creados, por lo que se produce
una penalizacin en la comunicacin entre estrategia y contexto (hay una
indireccin adicional).
>Estructura
>Implementacin
public abstract class EstrategiaDibujo extends JFrame {
private float[] _x,_y;
private Color _c;
private int _ancho,_alto;
public EstrategiaDibujo() {
....
}
public abstract void dibujar(float[] px, float[] py);
}
Referencias
http://es.wikipedia.org/wiki/Abstract_Factory
http://es.wikipedia.org/wiki/Singleton
http://es.wikipedia.org/wiki/Adapter_(patr%C3%B3n_de_dise%C3%B1o)
http://es.wikipedia.org/wiki/Decorator_(patr%C3%B3n_de_dise%C3%B1o)
http://es.wikipedia.org/wiki/Facade_(patr%C3%B3n_de_dise%C3%B1o)
http://es.wikipedia.org/wiki/Observer_(patr%C3%B3n_de_dise%C3%B1o)
http://es.wikipedia.org/wiki/Strategy_(patr%C3%B3n_de_dise%C3%B1o)
Asignatura:
Ingeniera de Software
Maestro Titular:
Martha Estela Valenzuela Tirado
Hora:
09:00-10:00
Elaborado por:
Sandoval Morales Jess Ivn
Fecha de Entrega:
28/03/14