Upload
carloshrueda
View
224
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Diseño de patrones colombia
Citation preview
Patrones de diseño
Rubby Casallas
Departamento de Ingeniería de
Sistemas y Computación
Universidad de los Andes
1
Referencias
� Erich Gamma, Richard Helm, Ralph Johnson,
John Vlissides. Design Patterns. Addison
Wesley. 1994.
� GRAND, Mark. Patterns in Java. Volumen 1 y � GRAND, Mark. Patterns in Java. Volumen 1 y
2. Wiley Computer Publishing. 1998.
2
Agenda
� Introducción a Patrones de diseño
� Interfaces
� Delegación
� Factory Method
� Abstract Factory� Abstract Factory
� Strategy
� Builder
3
Cómo los patrones de diseño
resuelven problemas de diseño� Los problemas:
� Encontrar los objetos apropiados
� Determinar la granularidad de los objetos
� Especificar las interfaces� Especificar las interfaces
� Especificar las implementaciones
4
Encontrar los objetos apropiados
� “The hard part about object-oriented design is
decomposing a system into objects. The task is difficult
because many factors come into play: encapsulation,
granularity, dependency, flexibility, performance,
evolution, reusability, and on and on. They all influence evolution, reusability, and on and on. They all influence
decomposition, often in conflicting ways.”
� Design Patterns. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Addison Wesley. 1994.
� Página 11.
5
Encontrar los objetos apropiados
� Un diagrama de clases de análisis modela (o intenta modelar) el mundo del problema
� Un diagrama de clases de diseño modela la solución al problema.
� Un diagrama de clases de diseño incluye clases que vienen del análisis, pero hay otras clases que no tienen Un diagrama de clases de diseño incluye clases que vienen del análisis, pero hay otras clases que no tienen contra parte en el mundo real
� Los patrones de diseño ayudan a identificar abstracciones menos obvias.
� Un patrón de diseño sirve para resolver un problema de diseño en un contexto particular.
� Se describen siempre como una pareja problema-solución
6
Interfaces
� El comportamiento de los objetos puede ser descrito por
una caracterización abstracta de su interfaz. Por
ejemplo:
� Un libro en una biblioteca: prestar, devolver, destruir, reservar
� Una ventana de una interfaz gráfica: desplegar, abrir, cerrar, � Una ventana de una interfaz gráfica: desplegar, abrir, cerrar, cambiarTamaño, arrastrar
� La caracterización del comportamiento es suficiente
para diseñar el sistema. El comportamiento real del
objeto puede ser implementado y refinado más tarde de
acuerdo con las necesidades.
7
Interfaces
javax.sql.DataSource
Connection getConnect ion()
Connection getConnect ion(String username, String password)
PrintWriter getLogWriter()
void setLogWriter(PrintWriter out)
<<Interface>>
OntologyDB uses
8
Implementation1 Implementation2 Implementation n
Interfaces
� Ventajas:
� No hay acoplamiento entre la clase cliente de la interface y la implementación
� Quiere decir que la implementación se puede cambiar
sin tener que cambiar el cliente de la interfacesin tener que cambiar el cliente de la interface
� El diseñador y el programador de la clase cliente no necesita saber cómo esta realizada la implementación y
� No necesita tener la implementación para diseñar el cliente
9
Delegación
ModelFacade
createOntologyModel()
DOMStrategy
createOntologyModel()
10
createOntologyModel()
{
OntologyModel om = ds.createOntologyModel();
}
Delegación
� Ventajas
� Es fácil componer comportamientos en ejecución y cambiar la forma en que están compuestos
� Es una manera de remplazar la herencia que Es una manera de remplazar la herencia que implica un alto grado de acoplamiento
11
Patrones de creacón de objetos: Fábricas
� Fábrica simple:� Se define una clase que crea objetos de otras
� Método fábrica:� Se define una interface para crear objetos
� se delega a las subclases implementar la creación de un producto concreto concretoun producto concreto concreto
� Abstract Factory: � Se define una interface (o una clase abstracta) para
crear objetos de alguna familia sin especificar la clase en concreto
� Se delega a las subclases implementar la creación de los productos concretos concreto
Fábrica simple
public class FactoriaJuegos {
public static Juego getJuego( String
nombreJuego ) {
if ( nombreJuego.equals("JuegoDelDado") )
return new JuegoDelDado();
else {
if (nombreJuego.equals("JuegoDeMoneda") )
return new JuegoDeMoneda(); return new JuegoDeMoneda();
else
return null;
}
}
}
Factory Method
public abstract class Creator {
public Product anOperation() {
return factoryMethod();
}
protected abstract Product factoryMethod();
}
public class ConcreteCreator extends Creator {
protected Product factoryMethod() {
return new ConcreteProduct();
}
}
public interface Product {
public void operacion(); public void operacion();
}
public class ConcreteProduct implements Product {
public void operacion()
{
System.out.println("Una operación de este producto");
}
}
public static void main(String args[]) {
Creator aCreator = new ConcreteCreator();
Product producto = aCreator.anOperation();
producto.operacion();
}
Factory Method
� Define una Interface para crear un objeto
pero deja a sus implementaciones decidir
cuál clase efectivamente instanciará el objeto
17
Factory Method
Ne w In t e rfac e< < In t e rfac e > >
C lie n t
< < In t e rfac e > >
18
Co n c re t e C re at o r Co n c re t P ro d u c t
N e w In t e rfac e
Fa ct o ryM e t h od ( ) : P ro d u c t
im p le m e n t s
P ro d u c t< < In t e rfac e > >
Factory Method
� Se usa cuando no se puede anticipar cuál
clase será la que creará el objeto
� Se puede implementar con clases abstractas
y proveer una instanciación por defectoy proveer una instanciación por defecto
� En el caso de lenguajes con tipos
parámetricos, se puede también implementar
con un template
19
Factory Method en Java
� En ejecución se decide quién será la
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
� En ejecución se decide quién será la
fábrica!!
20
java -Djavax.xml.parsers.SAXParserFactory=yourFactoryHere
Factory Method en Java
javax.xml.parsers.SAXParserFactory
static SAXParserFactory newInstance()
abstract SAXParser newSAXParser()
<<abstract>>
SAXStrategy uses
21
org.apache.xerces.jaxp.SAXParserFactoryImpl
<<concrete>> OtherConcreteFactory
org.apache.xerces.jaxp.SAXParserImpl
<<concrete>>
javax.xml.parsers.SAXParser
<<abstract>>uses
creates
Abstract Factory
Abstract Factory
� Este patrón es también conocido como kit o Toolkit
� Caso:
� Construir un sistema de ventanas sobre varias plataformas ( ms-windows, motif, java-swing)
� El patrón ayuda a definir una solución general que � El patrón ayuda a definir una solución general que
independiente de la plataforma particular.
� Por ejemplo, cuando se solicite la creación de una
ventana se hará sobre la plataforma que se decidió en
tiempo de ejecución.
23
Abstract Factory
� Estrategia de solución:
� Dado un conjunto de clases abstractas relacionadas (por ejemplo, la ventana, el menú, el panel, etc.) proveer una forma para crear instancias concretas. instancias concretas.
� El cliente puede decidir cuál fábrica utilizará en el último momento (puede ser un valor parámetro al momento de la ejecución)
� Para el resto del código, el cliente sólo utiliza las clases abstractas
24
Abstract Factory
25
Strategy
� Define una familia de algoritmos, los
encapsula y los hace intercambiables
� Los algoritmos pueden cambiar
independientemente de los clientes que los independientemente de los clientes que los
usan
26
Strategy
ParserStrategy
abstract createOntologyModel() : OntologyModel
static getInstance() : ParserStrategy
<<abstract>>
ModelFacade
27
DOMStrategy
createOntologyModel()
SAXStrategy
createOntologyModel()
Builder
� Separa la construcción de un objeto complejo
de su representación.
� El mismo proceso puede ser utilizado para
construir diferentes representacionesconstruir diferentes representaciones
28
Builder
Builder<<Interface>>
Client
Director
Construct() : Product
29
foreach item in structure
builder.BuildPart()
BuildPart()
ConcretBuilder
BuildPart()GetResult()
Product
Construct() : Product
Strategy
public class CompanyTaxStrategy implements TaxStrategy<Company> {
private static final double BIG_COMPANY_RATE = 0.30;
private static final double SMALL_COMPANY_RATE = 0.15;
public double extortCash(Company company) {
if (company.getNumberOfEmployees() > 5 &&
company.getIncome() < 1000000) {
return company.getIncome() * SMALL_COMPANY_RATE;
}
else return company.getIncome() * BIG_COMPANY_RATE;
}
} }
http://www.javaspecialists.eu/archive/Issue123.html