Documentos de Académico
Documentos de Profesional
Documentos de Cultura
9 de junio de 2009
Índice
1. Patrones Creacionales 2
1.1. Factory-Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Singleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Abstract Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4. Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.5. Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3. Patrones Estructurales 7
3.1. Decorador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2. Cadena de Responsabilidades . . . . . . . . . . . . . . . . . . . . 8
3.3. Adaptador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4. Fachada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.5. Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.6. Bridge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.7. Aggregate Enforcer . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4. Patrones Comportamentales 13
4.1. Comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2. Mediador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.3. Memento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.4. Observer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.5. Interpreter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.6. State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.7. Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.8. Template Method . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1
5. Patrones Concurrentes 18
5.1. Critical Section . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.2. Consistent Lock Order . . . . . . . . . . . . . . . . . . . . . . . . 19
5.3. Guarded Suspension . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.4. Read-Write Lock . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1. Patrones Creacionales
1.1. Factory-Method
Algunos clientes suelen saber que sublclase de una jerarquía puede utilizar,
pero no sabe exactamente cual, es por esto que se dene una superclase que
dene métodos generales para que sus subclases los sobreescriban, de tal forma
que un cliente pueda mantener una referencia de la superclase. Por ejemplo se
tiene una aplicación de registro, que permite enviar mensaje que ya sea por
consola o a un archivo plano, en general debe existir un método que permita
registrar un mensaje, y una subclase por cada tipo de registro que se quiera, en
este patrón un cliente debe denir cual clase debe utilizar, lo que puede resultar
en un problema. Para evitar esto, se dene una clase fabrica que debe decidir
que objeto es el que necesita el cliente y crearlo.
1.2. Singleton
2
FabricaCarrosLujosos y la segunda los CarrosNoLujosos, las cuales heredan de
una clase denominada Fabrica, esta clase permite obtener una fabrica de acuerdo
a un criterio ya establecido, por ejemplo el tipo de carro, en este punto se hace
uso del patrón Factory Method. Finalmente cada fabrica permitirá crear un
carro de acuerdo a un criterio de tipo, es decir si es una camioneta o un carro,
obteniendo así el objeto nal.
Ventajas:
Desventajas:
1.4. Prototype
Ventajas:
1.5. Builder
3
El patrón builder es útil cuando es necesario cuando el algoritmo de creación
de un objeto debe ser independiente de las partes que lo conforman, también es
útil cuando se necesita crear mas de una representación de un objeto.
Cada uno de los pasos que se llevan a cabo para la creación del objeto son
denidos como métodos, en una interfaz a ser implementada por los diferentes
constructores (builders) concretos. Existirá entonces una clase que sabe cuales
son los pasos a seguir para crear el objeto, la cual es denominada director,
es responsable de invocar los diferentes métodos de la clase builder para la
creación del objeto nal. Así los objetos clientes no necesitan comunicarse con
los diferentes métodos de construcción del objeto.
Ventajas:
2.1. Composite
Ventajas:
2.2. Iterator
4
provea una interfaz pública comúnmente denominada Iterador, a los diferentes
objetos que acceden a su contenido. Esta interfaz debe proveer métodos a los
objetos cliente para navegar a través de la lista de objetos.
El iterador puede funcionar también como un ltro, es decir que se puede
iterar sobre una colección sobre el siguiente objeto pero que cumpla una condi-
ción especica, en estos casos la clase que implementa la interaz Iterador dbe
retornar un conjunto de objetos seleccionados que cumplan con la condición del
ltro.
Este patrón de diseño tiene dos enfoques el primero es un Iterador interno,
por ejemplo, se tiene una clase Candidate, otra AllCandidates que tiene una
colección de objetos de la clase Candidate y además implementa la interfaz
Iteratod del paquete java.util, sobre-escribiendo los métodos next() y hasNext(),
es decir que la clase AllCandidates debe saber en que momento puede ir a un
siguiente elemento (hasNext) y devolver el elemento (next) posteriormente. Para
lograrlo debe tener un atributo que permita conocer el estado de la lista, en este
caso se obtiene un objeto de la clase Enumeration desde el Vector que contiene
los objetos de la clase Candidate, el objeto de la clase Enumeration permite
obtener el siguiente elemento, así se puede saber si hay un siguiente elemento
y se guarda en una variable globar para retornarlo en la llamada a next(). Con
esto se concluye que la clase AllCandidates la cual tiene la colección sabe en
todo momento el estado de la iteración, el iterador se encuentra en esta misma
clase, es decir que solo hay uno por cada objeto, es decir que no puede seer
utilizado en procesos concurrentes o por otros objetos que puedan utilizar la
iteración al mismo tiempo.
El segundo enfoque de este patrón es el Iterador Externo, de esta forma la
funcionalidad del Iterador se separa de la clase contenedora de la colección y se
delega a otra, trabajando con el ejemplo anterior se tienen las clases Candidate
y AllCandidates, pero ahora la clase AllCandidates no es la que implenta la
interfaz Iterador, esto lo hará la clase CertiedCandidates que además hará un
ltro especico (Certied), esta última clase se encargará de mantener el estado
del Iterador y proveer los métodos next() y hasNext(). La clase AllCandidates
provee los métodos getCertiedCandidates que retorna un nuevo objeto de la
clase CertiedCandidates en cada llamada y getAllCandidates que retorna un
objeto de la clase Enumeration que se obtiene del vector. Con este enfoque se
pueden obtener multiples Iteradores de una misma colección al mismo tiempo, al
mantener el estado de la iteración en una clase separada a la clase contenedora.
2.3. Flyweight
5
Ejemplo
2.4. Visitador
Ejemplo
6
Non-California order : Ordenes a entregar fuera de California, no aplica im-
puesto.
Para dar solución a este problema se crea una clase por cada tipo de or-
den, NonCaliforniaOrder, CaliforniaOrder, OversearOrder. Cada clase tie-
ne los atributos necesarios que representan los costos para cada orden, la clase
NonCaliforniaOrder tiene el atributo orderAmount y un método correspon-
diente para acceder al mismo, de igual forma la clase CaliforniaOrder tiene
los atributos additionalTax() y orderAmount y la clase OversearOrder tiene
los atributos orderAmount y additionalSH. Para que sea posible denir una
operación que calcule el costo total de la orden para todos los objetos teniendo
en cuenta que cada objeto tiene atributos diferentes se crea una interfaz Visitor.
La interfaz dene el método visit(OrderType), uno por cada tipo de orden. Se
crea una clase llamada OrderVisitor que realiza esta última interfaz, para cada
clase se dene el método correspondiente visit(), en el que se calcula el costo
total de cada orden.
3. Patrones Estructurales
3.1. Decorador
Ejemplo
Se tiene una interfaz Logger con un método log, recibiendo como parámetro
una cadena de caracteres, hay dos clases que implementan dicha interfaz, la clase
ConsoleLogger que se encarga de mostrar el mensaje en consola con la llamada
al método log y la clase FileLogger que se encarga de escribir el mensaje en
un archivo cuando el método log es llamado, para la creación de un Logger se
LoggerFactory, que hace uso del patrón de diseño Factory
hace uso de la clase
Method, el mensaje que se envía al método log de estas clases es una cadena
de texto, pero ahora se desea que el mensaje pueda ser encriptado o etiquetado
con HTML, se crea entonces la clase LoggerDecorator, esta clase implementa
la interfaz Logger y mantiene un objeto concreto de dicha interfaz llamado
logger que debe ser pasado al Decorador antes de llamar al método log, el
objeto logger podría ser del tipo ConsoleLogger ó FileLogger. En el método
log de la clase LoggerDecorator se hace la llamada al método log del objeto
logger, para dar la posibilidad de decorar el mensaje ahora se crean las clases
HTMLLogger y EncryptLogger que heredan de la clase LoggerDecorator, en el
método log de cada una de estas clases la cadena de caracteres es decorada ,
en el primer caso con etiquetas HTML y en el segundo caso con un encriptado
sencillo, posteriormente se llama el método log a partir del objeto logger.
Cuándo un objeto cliente quiere decorar los mensajes de registro crea el
objeto Decorador y pasa el tipo de Logger que usará. Luego llama al método
7
log del Decorador pasando el mensaje.
El decorador funciona como un wrapper (en español, envolotor) de los objetos
de tipo Logger,
Este patrón de diseño busca un bajo grado de acoplamiento entre los objetos
que hacen una solicitud y los objetos que la atienden. Cuando se tiene mas de
un objeto que puede atender una solicitud se sugiere que se pueda atender
secuencialmente con estos objetos formando una cadena. Cada objeto tiene una
referencia al objeto siguiente, el primer objeto decide a que objeto pasa y así
sucesivamente hasta llegar al nal.
Ejemplo
3.3. Adaptador
8
Ejemplo
Clase Adaptador:
Consiste en una clase que hereda de la clase adaptada, además realiza la interfaz
esperada por el cliente, de tal forma que está nueva clase Adaptador será la que
use el cliente, la cuál llama al método requerido internamente.
Se tiene una interfaz AddressValidator, la cual dene el método isValidAd-
dress, con el n de validar una dirección, existe la clase USAddress realiza dicha
interfaz, validando la dirección de los Estados Unidos, la clase CAAddress per-
mite validar las direcciones de Canadá, con la diferencia que lo hace a través del
método isValidCanadianAddr, la clase cliente es la clase Customer, en la que se
tiene una dirección con postal y el estado, los cuales deben ser validados según
el tipo de consumidor (Customer). La clase cliente debe tener un objeto que sea
una ejemplicación de una clase concreta que realice la interfaz AddressValida-
tor, el cual se obtiene con el método getValidator de la clase cliente.
Para lograr que la clase Customer pueda reutilizar el código de la clase
CAAddress se crea la clase CAAddressAdapter que hereda de la clase adaptada
(CAAddress) e implementa la interfaz AddressValidator, en el método isVali-
dAddress se hace el llamado al método isValidCanadianAddr logrando proveer
el servicio requerido por el cliente. De esta manera el cliente podrá acceder al
método a través de la interfaz AddressValidator sin importar el tipo de cliente.
Objeto Adaptador:
3.4. Fachada
9
cambie, por ejemplo en una interfaz, los clientes deberán afrontar estos cambios.
El patrón Fachada es útil en este tipo de situaciones, provee un mayor nivel,
una interfaz simplicada de un subsistema que como resultado reduce la com-
plejidad y dependencia. De esta manera el subsistema es más fácil de manejar
y administrable.
Con este patrón no se deberían incluir nuevas funcionalidades, tampoco re-
tornar objetos cliente. Este patrón busca desacoplar el subsistema del cliente
Ejemplo:
3.5. Proxy
Recibe las llamadas del objeto cliente y las envía al objeto objetivo.
10
Ejemplo:
Se toma como base el ejemplo del Patrón Fachada, pero ahora el almacena-
miento de la información no se debe hacer de forma local sino remota, por medio
del uso de RMI. Se diseña entonces una aplicación que representa el servidor y
Account, Address, Credit-
otra el cliente. En el servidor Se encuentran las clases
Card y CustomerFacade. La diferencia se presenta en esta última clase, ahora
se tiene la interfaz CustomerIntr que deberá ser realizada por la clase cliente y
por la clase CustomerFacade, está interfaz dene los mismo métodos que pre-
senta la clase CustomerFacade en el ejemplo anterior. La clase CustomerFacade
extiende de la clase UnicastRemoteObject del paquete de java.rmi de java, que
permite registrarlo como un objeto remoto y pueda ser accedida por el objeto
cliente.
La clase clienteAccountManager, también descrita en el patrón Fachada,
ahora no hace uso directo de la clase CustomerFacade, simplemente realiza la
interfaz CustomerIntr, luego se obtiene el objeto cliente buscando el servicio
en la red por medio de un nombre y dirección, el objeto CustomerFacade es
asignado a la clase cliente si el servidor es visible y accesible para el cliente,
nalmente el cliente accede al servicio de la misma manera en que lo hacia de
forma local.
En este ejemplo la implementación del proxy se encuentra en el objeto stub,
que se generado por el compilador de rmi (RMIC), en este caso el stub es gene-
rado del objeto CustomerFacade, permitiendo así que este objeto sea accedido
como si fuera de forma local y enviando la petición al servidor.
3.6. Bridge
Ejemplo:
11
funcionalidad de enviar un mensaje a un registro, ya sea la consola o un archivo
de texto plano.
Ahora se desea que esos mensajes puedan ser enviados en un formato dife-
rente, por ejemplo encriptado. Se podrían modicar las clases descritas anterior-
mente para cumplir con este requerimiento, pero se estaría violando el principio
básico de la orientación a objetos abierto para la extensión y cerrado para la
modicación.
Se dene entonces la interfaz Message con el método log, que representa
la abstracción, del mensaje que se registra, nacen entonces dos abstracciones
concretas, la clase EncryptedMessage y TextMessage, que realizan la interfaz
Message. Cada una de estas clases tiene una referencia a un objeto concre-
to de la interfaz MessageLogger, cuando el método log es llamado se hace un
pre-procesamiento del mensaje que se envía, en el caso de la clase EncryptedMes-
sage el mensaje es encriptado, en la clase TextMessage simplemente se retorna
el mismo mensaje. El cliente crea un objeto implementador, luego se crea la
abstracción y se congura con el objeto implementador, nalmente se envían
los mensajes directamente a la abstracción.
Ejemplo:
Computer
En el ejemplo se consideran tres enfoques, consiste en una clase
que es el objetoaggregate conformado por un objeto de la clase CPU. En la
clase Computer se encuentra el método initCPU donde es necesario que la clase
cpu este inicializada.
12
general se necesita una forma de hacer mandatario el hecho de inicializar el con-
junto de variables que representan el objeto que constituye el objeto aggregate.
4. Patrones Comportamentales
4.1. Comando
Ejemplo:
Se presenta una clase principal FTPGUI, esta es una ventana que contie-
ne una lista representando archivos locales y una lista representando archi-
vos remotos, existen cuatro acciones para el usuario Upload, Download, Delete,
Exit. La opción Upload permite trasladar un archivo de la lista local a la lis-
ta remota, la opción Download permite llevar un archivo de la lista Remota
a la local, con Delete se elimina el archivo seleccionado, la opción Exit na-
liza la aplicación. La abstracción que representa las operaciones es la interfaz
CommandInterface con el método processEvent(). Cada una de las acciones
es llevada a una clase concreta que realiza esta interfaz y además hereda de
la clase JButton, de esta forma se agregan a la ventana principal, en el méto-
do processEvent() se realizaran las operaciones que correspondan, las clases
creadas son UploadButton, DownloadButton, DeleteButton y ExitButton. Se
tiene la clase buttonHandler que realiza la interfaz ActionListener con el n
de saber en que momento de selecciona una de las acciones.
En el momento que el usuario selecciona una acción la petición es enviada a la
clase buttonHandler por medio del método actionPerformed (), este método
recibe como parámetro el botón que fue seleccionado, gracias a que todos los
botones realizan la interfaz CommandInterface se llama directamente el método
processEvent(), se envía la petición directamente al botón correspondiente sin
tener la necesidad de identicar cual fue seleccionado.
13
4.2. Mediador
Ejemplo:
Se trabaja con el mismo ejemplo del patrón Comando, ahora se desea desha-
bilitar las opciones de acuerdo a la selección del usuario o a la acción ejecutada,
si el usuario selecciona un archivo de la lista local la opciónDownload es des-
habilitada y los items de la lista remota no pueden estar seleccionados. En caso
que la selección sea hecha en la lista Remota, la opción Upload es deshabilitada
y los items de la lista local no pueden estar seleccionados. Se agrega ahora la
Mediator con una referencia a los objetos que son botones UploadButton,
clase
DownloadButton, DeleteButton y a las listas LocalList, RemoteList. Para
que el mediador pueda recibir estos objetos se crea un método para registrar
cada uno de estos, en el caso de un objeto de la clase UploadButton el méto-
do correspondiente es registerUploadButton(), de igual manera para todos los
objetos que se encuentran en el mediador.
Por cada uno de los objetos se crea un método debido a que a cada uno
le corresponde una acción por el usuario, para el botón UploadButton se crea
el método UploadItem(), en este caso se dene que archivo se debe tomar
de la lista local y enviarlo a la lista remota, nalmente todos los botones son
deshabilitados debido a que ningún archivo queda seleccionado.
4.3. Memento
Ejemplo:
14
encargada de procesar la información en el método process(), se lee y valida
la información por cada cliente, cuando se presente un error en la validación se
debe almacenar el ID del último cliente leído. La clase Memento tiene el atributo
lastProcessedID y realiza la interfaz Serializable que permite almacenar
este objeto en un archivo. Al iniciar la aplicación una ejemplicación de la clase
MementoHandler lee del archivo ID el objeto memento si el archivo es encon-
trado. Posteriormente se crea el objeto objConverter de la clase DataConverter
y se le pasa el objeto memento leído, si no es nulo se almacena el id del objeto
memento en la variable ID de la clase DataConverter (ID es cero por defecto).
Al llamar el método process(), se verica que el último ID leído sea menor al
que se lee del archivo, si es así se crea un objeto de la clase Customer con la
información leída, se realiza la validación para convertirla a una sentencia sql
y se almacena, si el ID es mayor al id leído del archivo se lee otro cliente. En
caso de encontrarse información que no es valida se naliza el método process()
retornando estado de error, en este caso se solicita a la clase DataConverter
un objeto Memento con el estado actual, el objeto de la clase MementoHandler
almacena el objeto Memento al archivo ID y notica al usuario que existe un
error en la información de los clientes, solicitando que sea corregido. Así cuando
el proceso es reiniciado se continua con el ID que tenia error.
4.4. Observer
Ejemplo:
15
acuerdo al departamento seleccionado en el sujeto, la ventana YTDChart muestra
el gráco correspondiente también al departamento seleccionado del sujeto.
4.5. Interpreter
Ejemplo:
4.6. State
16
Ejemplo:
4.7. Strategy
Ejemplo
17
implementa el algoritmo de cada uno de estos métodos. El contexto en este caso
es representado por la clase EncryptLogger, el cual tiene un objeto que realice
EncryptionStrategy, este objeto puede ser cambiado con el método
la interfaz
setEncryptionStrategy(), tiene una referencia a un objeto FileLogger, y un
método log() para enviar el mensaje al archivo, que al ser llamado encripta
el mensaje y lo registra. La clase LoggerClient es la clase cliente, la cual crea
inicialmente el contexto, puede enviar un mensaje al registro o puede cambiar
el algoritmo dinamicamente.
Este patrón de diseño permite es usado cuando un algoritmo que sigue una
serie de pasos, puede ser implementado siguiendo diferentes caminos. Se sugie-
re que el esquema del algoritmo se encuentre en un método separado que se
denomina método plantilla, en una clase que se plantilla, dejando la libre la im-
plementación de cada uno de los pasos del algoritmo. Aunque no es necesario
dejar todos los pasos a la implementación
Ejemplo
5. Patrones Concurrentes
Una sección crítica es un segemento de código que solo puede ser ejecutado
en un hilo a la vez. Cuando dos objetos intentan ejecutar este segmento de
código al mismo tiempo, esto puede llevar a resultados inesperados.
Ejemplo
Sección Crítica:
18
Se tiene una clase FileLogger que permite enviar un mensaje a un archivo de
registro plano (en inglés log ), en la aplicación solo se debe poder crear un objeto
logger cada vez, por lo que se ha implementado el patrón Singleton, el méto-
do getFileLogger() permite obtener un objeto único de la clase FileLogger,
que se almacena en el atributo logger. Pensando en una aplicación que pueda
acceder a este método concurrentemente la creación del objeto se introduce en
una sección crítica que se logra al agregar la palabra synchronized, del lenguaje
de programación java, a la denición del método getFileLogger() asegurando
de esta forma que solo un hilo puede acceder a este método al tiempo.
Inicialización Temprana:
Cuando se crea una sección crítica solo se esta asegurando que dos objetos
cliente no hagan el llamado a un método en un mismo instante del tiempo,
se puede presentar el caso en el que un hilo mantiene bloqueado un objeto y
estan a la espera de un objeto que mantiene bloqueado otro hilo. Los dos hilos
permanecen esperando por siempre y se dice que han caido en un iterbloqueo
(en inglés deadlock ).
Ejemplo
19
Ejemplo
Ejemplo
20