Design_patterns Uniandes Colombia

Preview:

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