33
Patrones de diseño Rubby Casallas Departamento de Ingeniería de Sistemas y Computación Universidad de los Andes 1

Design_patterns Uniandes Colombia

Embed Size (px)

DESCRIPTION

Diseño de patrones colombia

Citation preview

Page 1: Design_patterns Uniandes Colombia

Patrones de diseño

Rubby Casallas

Departamento de Ingeniería de

Sistemas y Computación

Universidad de los Andes

1

Page 2: Design_patterns Uniandes Colombia

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

Page 3: Design_patterns Uniandes Colombia

Agenda

� Introducción a Patrones de diseño

� Interfaces

� Delegación

� Factory Method

� Abstract Factory� Abstract Factory

� Strategy

� Builder

3

Page 4: Design_patterns Uniandes Colombia

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

Page 5: Design_patterns Uniandes Colombia

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

Page 6: Design_patterns Uniandes Colombia

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

Page 7: Design_patterns Uniandes Colombia

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

Page 8: Design_patterns Uniandes Colombia

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

Page 9: Design_patterns Uniandes Colombia

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

Page 10: Design_patterns Uniandes Colombia

Delegación

ModelFacade

createOntologyModel()

DOMStrategy

createOntologyModel()

10

createOntologyModel()

{

OntologyModel om = ds.createOntologyModel();

}

Page 11: Design_patterns Uniandes Colombia

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

Page 12: Design_patterns Uniandes Colombia

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

Page 13: Design_patterns Uniandes Colombia

Fábrica simple

Page 14: Design_patterns Uniandes Colombia

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;

}

}

}

Page 15: Design_patterns Uniandes Colombia

Factory Method

Page 16: Design_patterns Uniandes Colombia

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

}

Page 17: Design_patterns Uniandes Colombia

Factory Method

� Define una Interface para crear un objeto

pero deja a sus implementaciones decidir

cuál clase efectivamente instanciará el objeto

17

Page 18: Design_patterns Uniandes Colombia

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

Page 19: Design_patterns Uniandes Colombia

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

Page 20: Design_patterns Uniandes Colombia

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

Page 21: Design_patterns Uniandes Colombia

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

Page 22: Design_patterns Uniandes Colombia

Abstract Factory

Page 23: Design_patterns Uniandes Colombia

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

Page 24: Design_patterns Uniandes Colombia

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

Page 25: Design_patterns Uniandes Colombia

Abstract Factory

25

Page 26: Design_patterns Uniandes Colombia

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

Page 27: Design_patterns Uniandes Colombia

Strategy

ParserStrategy

abstract createOntologyModel() : OntologyModel

static getInstance() : ParserStrategy

<<abstract>>

ModelFacade

27

DOMStrategy

createOntologyModel()

SAXStrategy

createOntologyModel()

Page 28: Design_patterns Uniandes Colombia

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

Page 29: Design_patterns Uniandes Colombia

Builder

Builder<<Interface>>

Client

Director

Construct() : Product

29

foreach item in structure

builder.BuildPart()

BuildPart()

ConcretBuilder

BuildPart()GetResult()

Product

Construct() : Product

Page 30: Design_patterns Uniandes Colombia

Strategy

Page 31: Design_patterns Uniandes Colombia
Page 32: Design_patterns Uniandes Colombia
Page 33: Design_patterns Uniandes Colombia

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