Publicado el 16 de Abril del 2017
1.700 visualizaciones desde el 16 de Abril del 2017
4,5 MB
82 paginas
Creado hace 18a (09/05/2006)
Reutilización del Software
Patrones de Diseño
1
Introducción
• El diseño OO es difícil y el diseño de software
orientado a objetos reutilizable lo es aún más.
• Los diseñadores expertos no resuelven los
problemas desde sus principios; reutilizan
soluciones que han funcionado en el pasado.
– Se encuentran patrones de clases y objetos de
comunicación recurrentes en muchos sistemas
orientados a objetos.
– Estos patrones resuelven problemas de diseño
específicos y hacen el diseño flexible y reusable.
2
Definición de un patrón
Alexander(arquitecto/urbanista)
Cada patrón describe un problema que
ocurre una y otra vez en nuestro
entorno y describe también el núcleo de
la solución al problema, de forma que
puede utilizarse un millón de veces sin
tener que hacer dos veces lo mismo.
3
Definición de un patrón de diseño
[Gamma]
Un patrón de diseño es una descripción
de clases y objetos comunicándose
entre sí adaptada para resolver un
problema de diseño general en un
contexto particular.
4
Introducción
• Es un tema importante en el desarrollo de
software actual: permite capturar la experiencia
• Busca ayudar a la comunidad de desarrolladores
de software a resolver problemas comunes,
creando un cuerpo literario de base
– Crea un lenguaje común para comunicar ideas y
experiencia acerca de los problemas y sus soluciones
• El uso de patrones ayuda a obtener un software
de calidad (reutilización y extensibilidad)
5
Elementos de un patrón
• Nombre: describe el problema de diseño.
• El problema: describe cuándo aplicar el
patrón.
• La solución: describe los elementos que
componen el diseño, sus relaciones,
responsabilidades y colaboración.
6
Más información en...
• Desing Patterns. E. Gamma, R. Helm, R.
Johnson, and J. Vlissides. Design Patterns.
Addison Wesley, 1995.
• Patterns Home Page: http://hillside.net/patterns/
• Thinking in patterns with java
http://www.mindview.net/Books/TIPatterns/
7
Clasificación de los patrones
• Según su propósito:
– De creación: conciernen al proceso de creación
de objetos.
– De estructura: tratan la composición de clases
y/o objetos.
– De comportamiento: caracterizan las formas en
las que interactúan y reparten responsabilidades
las distintas clases u objetos.
8
Clasificación de los patrones
GoF (gang of Four) [Gamma]
Propósito
Ámbito
Clase
Objeto
Creación
Estructural
Comportamiento
Factory Method Adapter
Adapter
Bridge
Abstract Factory
Builder
Prototype
Singleton
Interpreter
Template Method
Chain of Responsability
Command
Iterator
Mediator
Memento
Observer
Strategy
Visitor
State
Composite
Decorator
Facade
Flyweight
Proxy
Además: PATRONES DE DISEÑO FUNDAMENTALES
9
Patrones de diseño fundamentales
Son patrones que no aparecen la tabla definida
por Gamma, pero se utilizan habitualmente:
• DELEGATION
• INTERFACE
• MARKER INTERFACE
10
Patrón DELEGATION
Utilidad:
Cuando se quiere extender y reutilizar la
funcionalidad de una clase SIN UTILIZAR LA
HERENCIA
Ventajas:
• En vez de herencia múltiple
• Cuando una clase que hereda de otra quiere
ocultar algunos de los métodos heredados
• Compartir código que NO se puede heredar
11
Patrón DELEGATION
El problema
Clase A
a1()
….
Clase B
b1(),b2()
….
Clase C
a1(), b1(), b2()
….
- El lenguaje utilizado NO PERMITE HERENCIA MÚLTIPLE
- La clase C no desea TODOS los métodos de B
12
Patrón DELEGATION
La solución
Clase A
a1()
….
Clase C
a1(), b1()
….
Clase B
b1(), b2()
….
usa
El método b1() habrá que
añadirlo a C
NO USAR HERENCIA
SINO LA RELACIÓN “USA”
13
Patrón DELEGATION
Implementación
class C extends A {
B objB;
C ( ) { // En la constructora se puede crear obj. de B
objB=new B();
}
void b1( ) { objB.b1( );}
….
14
Patrón INTERFACE
Utilidad y Ventajas
Utilidad
Definir un comportamiento independiente de
donde vaya a ser utilizado
Ventajas
Desacople entre comportamiento y clase.
Realización de clases “Utilities”
15
Patrón INTERFACE
El problema
Utilities
void imprimirEstructura (????? o) {
o.irAlPrimero();
while (o.tieneElems() );
imprimir (o.obtenerSiguiente() );
}
Todos los objeto o, tienen que implementar:
irAlPrimero(), tieneElems(), obtenerSiguiente().
Problema: De qué tipo son los objetos o?
16
Patrón INTERFACE
La solución
Clase Utilities
ImprimirEstructura(Recorrible o)
….
usa
Interfaz Recorrible
irAlPrimero(),
tieneElems(),
obtenerSiguiente().
implementa
Clase A
irAlPrimero(),
tieneElems(),
obtenerSiguiente().
Solución: Definir los parámetros de un tipo Interfaz.
Todas las clases(instancias) que quieran utilizar ese comportamiento
deberán implementar dicho interfaz
17
Patrón INTERFACE
Implementación
class MiClase<T> implements Recorrible<T> {
Vector<T> v=new Vector<T>();
int pos;
void irAlPrimero() { pos=0;}
boolean tieneElems() {v.lenght < pos;}
T obtenerSiguiente() {
T o=v.elementAt(pos); pos++;
return o; }
}
}
18
Patrón INTERFACE
Ejemplo
// Estructuras de datos, algoritmos y predicados JGL
Array queue = new Array( );
queue.add( ...);
Counting.countIf(queue, new MayorEdad());
Uso de
countIf
class MayorEdad implements UnaryPredicate {
public boolean execute (Object o1)
{ ...... } }
Definición: Counting.countIf(Container,UnaryPredicate);
19
Patrón MARKER INTERFACE
Utilidad y Ventajas
• Utilidad
– Sirve para indicar atributos semánticos de
una clase.
• Ventajas:
– Se puede preguntar si un objeto pertenece
a una clase de un determinado tipo o no.
– Habitualmente se utiliza en clases de
utilidades que tienen que determinar algo
sobre objetos sin asumir que son
instancias de una determinada clase o no.
20
Patrón MARKER INTERFACE
Clase Utilidad
operacion(Object o)
….
usa
Interfaz Marker
Clase Marcada
Clase NoMarcada
m1()….
nm1()….
Dentro del código del método operacion(Object o) de la
clase Utilidad podemos preguntar si el objeto o es de una
clase Marker:
if (o instanceof Marker) {...}
else {...}
21
Patrón MARKER INTERFACE
Ejemplo
En Java hay clases “serializables”,
“cloneables”, etc. Para ello, basta con
que implementen las interfaces
Serializable, Cloneable, etc.
22
Clasificación de los patrones
GoF (gang of Four) [Gamma]
Propósito
Ámbito
Clase
Objeto
Creación
Estructural
Comportamiento
Factory Method Adapter
Adapter
Bridge
Abstract Factory
Builder
Prototype
Singleton
Composite
Decorator
Facade
Flyweight
Proxy
Interpreter
Template Method
Chain of Responsability
Command
Iterator
Mediator
Memento
Observer
Strategy
Visitor
State
23
Patrón SINGLETON
• Utilidad
– Asegurar que una clase tiene una sola instancia y
proporcionar un punto de acceso global a ella
• Ventajas
– Es necesario cuando hay clases que tienen que
gestionar de manera centralizada un recurso
– Una variable global no garantiza que sólo se instancie
una vez
24
Patrón SINGLETON
La solución
– El constructor de la clase DEBE SER PRIVADO
– Se proporciona un método ESTÁTICO en la clase que devuelve
LA ÚNICA INSTANCIA DE LA CLASE:
getInstance()
Clase CSingleton
- CSingleton laInstancia
….
- CSingleton ()
+ getInstance ()
Atributos
Métodos
Método
static
- indica que es private
+ indica que es public
25
Patrón SINGLETON
Implementación
public class CSingleton {
private static CSingleton laInstancia = new CSingleton();
private CSingleton() {}
public static CSingleton getInstance() {
return laInstancia;
}
………………………….
}
26
Patrón SINGLETON
Inconvenientes
Se podría obtener una nueva instancia usando el esquema anterior:
public class MiCSingleton extends CSingleton
implements Cloneable {}
MiCSingleton mcs = new MiCSingleton();
MiCSingleton mcsCopia = mcs.clone();
Para solucionarlo: definir CSingleton como final
public final class CSingleton {...}
27
public final class Facultad implements Serializable {
private Vector listaProfesores;
private Vector listaEstudiantes;
private Vector listaAsigs;
private Vector listaMatrs;
private static Facultad laFacultad=new Facultad();
private Facultad()
{ listaProfesores = new Vector(); // Sólo hay UNA instancia
PATRÓN
SINGLETON
// EL CONSTRUCTOR ES PRIVADO
EJEMPLO DE
listaEstudiantes= new Vector(); // y se guarda en laFacultad
listaAsigs = new Vector();
listaMatrs = new Vector(); }
public static Facultad getInstance() {return laFacultad;}
public Vector obtListaProfesores()
{return listaProfesores;}
public void anadirProfesor(Profesor p)
{listaProfesores.addElement(p); }
28
Patrón FACTORY METHOD
Utilidad
Separar la clase que crea los objetos, de la
jerarquía de objetos a instanciar
Ventajas
– Centralización de la creación de objetos
– Facilita la escalabilidad del sistema
– El usuario se abstrae de la instancia a crear
29
Patrón FACTORY METHOD
El problema
Clase A
oper1()
oper2()
...
Clase A’
oper1()
oper2()
...
Clase A’’
oper1()
oper2()
...
Programa1
If (tipo==1)
create A’
else
create A’’
Programa2
If (tipo==1)
create A’
else
create A’’
Problema: Qué sucede si queremos añadir A’’’?
30
Patrón FACTORY METHOD
Una primera solución
Clase A
oper1()
oper2()
static A create(tipo)
Clase A’
oper1()
oper2()
...
Clase A’’
oper1()
oper2()
...
Programa1
A.create(1);
Programa2
A.create(2)
Solución: Hay que recompilar todas las clases que heredan de A
Puede que no tengamos acceso al código de A
31
Patrón FACTORY METHOD
La solución final
Interfaz A
oper1()
oper2()
...
Clase CFactory
A create(tipo)
….
Clase A1
oper1()
oper2()
...
Clase A2
oper1()
oper2()
...
Solución: Separar el creador de las instancias de la propia clase
las instancias se crean en una clase CFactory
32
Patrón FACTORY METHOD
class Aplicación {
...
A newA(...) {
A miA;
CFactory fact= new CFactory();
...
miA = fact.create(“TIPO 2”);
...
return miA;
}
• No se crean las instancias direct
Comentarios de: Reutilización del Software - Patrones de Diseño (0)
No hay comentarios