Está en la página 1de 33

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
2. Wiley Computer Publishing. 1998.

2
Agenda

 Introducción a Patrones de diseño


 Interfaces
 Delegación
 Factory Method
 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 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
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
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,
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

<<Interface>>
javax. sql.DataSou rce
OntologyDB u ses Connection getConnect ion()
Connection getConnect ion(String username, String passw ord)
PrintW rit er getLogW riter()
void setLogW riter(PrintW riter out)

Implementation1 Implementation2 Implementation n

8
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 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 DOMStrategy

createOntologyModel() createOntologyModel()

createOntologyModel()
{
OntologyModel om = ds.createOntologyModel();
}

10
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
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 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();
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 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

C lie n t

< < In t e rfa c e > >


N e w In t e rf a c e < < In t e rf a c e > >
P ro d u c t
F a ct o ry M e t h od ( ) : P ro d u c t

im p le m e n t s

C o n c re t e C re a t o r C o n c re t P ro d u c t

18
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 defecto
 En el caso de lenguajes con tipos
parámetricos, se puede también implementar
con un template

19
Factory Method en Java
SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser saxParser = factory.newSAXParser();

 En ejecución se decide quién será la


fábrica!!
java -Djavax.xml.parsers.SAXParserFactory=yourFactoryHere

20
Factory Method en Java

<<abstract>>
javax.xml.parsers.SAXParserFactory
SAXStrategy uses
static SAXParserFactory newInstance()
abstract SAXParser newSAXParser()

<<concrete>> OtherConcreteFactory
org.apache.xerces.jaxp.SAXParserFactoryImpl

creates

uses
<<abstract>>
javax.xml.parsers.SAXParser

<<concrete>>
org.apache.xerces.jaxp.SAXParserImpl

21
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
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.
 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
usan

26
Strategy

<<abstract>>
ParserStrategy
ModelFacade

abstract createOntologyModel() : OntologyModel


static getInstance() : ParserStrategy

DOMStrategy SAXStrategy

createOntologyModel() createOntologyModel()

27
Builder

 Separa la construcción de un objeto complejo


de su representación.
 El mismo proceso puede ser utilizado para
construir diferentes representaciones

28
Builder
Client

<<Interface>>
Director
Builder

Construct() : Product
BuildPart()

foreach item in structure

builder.BuildPart()

ConcretBuilder
Product
BuildPart()
GetResult()

29
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

También podría gustarte