Beruflich Dokumente
Kultur Dokumente
Patrones de Software.
• Patrones Arquitectónicos.
• Describen soluciones al nivel más alto de software y
hardware.
• Normalmente soportan requerimientos no funcionales.
• Por ejemplo, MVC y PAC.
• Patrones de Diseño.
• Describen soluciones en el nivel medio de estructuras de
software.
• Usualmente soportan requerimientos funcionales.
• Patrones de Programación (Idioms).
• Describen soluciones en el nivel de software más bajo (clases
y métodos).
• Generalmente soportan características específicas de un
lenguaje de programación.
Ingeniería de Software. Patrones de Software Página 3
Los Patrones GoF Originales (1).
Creacionales
1. Singleton (y Multiton)
2. Factory Method
3. Abstract Factory
4. Builder
5. Prototype
Estructurales
6. Adapter
7. Bridge
8. Composite
9. Decorator
10. Façade
11. Flyweight
12. Proxy
Conductuales
13. Chain of responsibility 19. Observer
14. Command 20. State (*)
15. Intepreter 21. Strategy
16. Iterator 22. Template Method
17. Mediator 23. Visitor
18. Memento
Presentation Tier
1. Intercepting Filter
2. Front Controller
3. Context Object
4. Application Controller
5. View Helper
6. Composite View
7. Service To Worker
8. Dispatcher view
Business Tier
9. Business Delegate
10. Service Locator
11. Session Façade
12. Transfer Object
13. Transfer Object Assembler
14. Application Service
15. Business Object
16. Composite Entity
17. Data Transfer Object
18. Value List Handler
Integration Tier
19. Data Access Object
20. ServiceActivator
21. Domain Store
22. Web Service Broker
Problema:
Solución:
MainClass
- singleton: MainClass
- MainClass()
<<static>>
+ getInstance(): MainClass
Ejemplo de Solución.
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
// Private constructor prevents instantiation from other classes
private Singleton() { }
public static Singleton getInstance() {
return INSTANCE;
}
}
Problema:
Solución:
• Las clases que deseen crear objetos de clase Factory deben utilizar
el método createXXX.
Consecuencias:
• +
• Se pueden agregar subclases de productos en
forma transparente.
• Proporciona un mecanismo standard de creación
de objetos.
•-
• Overhead en el proceso comparado con new()
simple.
Problema:
Solución:
Consecuencias:
• +
• Aísla las clases concretas (principio de
inversión de la Dependencia).
• Facilita intercambiar familias de productos.
• Promueve la consistencia entre productos.
•-
• Es difícil soportar nuevas clases de productos.
/* GUIFactory example -- */
Problema:
Solución:
Estilo original:
Estilo alterno:
Consecuencias:
• +
• Hace el cliente simple.
• Facilita la agregación de nuevos tipos de
componentes
• -
• Puede hacer el modelo de diseño
demasiado general.
// Interfaz general
import java.util.List;
import java.util.ArrayList;
public interface Graphic {
// Prints the graphic.
public void print();
}
// Composite
import java.util.*;
public class CompositeGraphic implements Graphic {
// Collection of child graphics.
private List<Graphic> mChildGraphics = new ArrayList<Graphic>();
// Prints the graphic.
public void print() {
for (Graphic graphic : mChildGraphics) {
graphic.print();
}
// Client
public class Program {
public static void main(String[] args) {
// Initialize four ellipses
Ellipse ellipse1 = new Ellipse();
Ellipse ellipse2 = new Ellipse();
Ellipse ellipse3 = new Ellipse();
Ellipse ellipse4 = new Ellipse();
// Initialize three composite graphics
CompositeGraphic graphic = new CompositeGraphic();
CompositeGraphic graphic1 = new CompositeGraphic();
CompositeGraphic graphic2 = new CompositeGraphic();
// Composes the graphics
graphic1.add(ellipse1);
graphic1.add(ellipse2);
graphic1.add(ellipse3);
graphic2.add(ellipse4);
graphic.add(graphic1);
graphic.add(graphic2);
// Prints the complete graphic (four times the string "Ellipse").
graphic.print();
}
}
• Hace que el código que usa las clases sea más claro y legible.
Problema:
• Se tienen una serie de clases que hacen funciones similares pero
que tienen métodos diferentes.
Solución:
• Crear una clase Façade que incluya las diferentes clases como
atributos.
Consecuencias:
• +
• Mantiene el cliente simple y limpio.
• Reduce la complejidad de acceso a subsistemas.
• Permite la reutilización de sistemas legado con una nueva
interfaz.
•-
• Mayor número de clases.
• Difícil de probar.
// Client
public class User {
public static void main(String[ ] args) {
Computer facade = new Computer();
facade.startComputer();
}
}
Problema:
Solución:
Consecuencias:
• +
• Alternativa a usar subclases.
• Elimina postulados condicionales en la
implementación.
• -
• Overhead entre Strategy y Context.
• Se incrementa el número de objetos.
Problema:
Solución:
Consecuencias:
• +
• Acoplamiento abstracto entre Subject y Observer.
• Soporte para notificaciones en modo multicast.
• -
• Actualizaciones no esperadas en los
observadores.
import java.util.Observable;
import java.io.*
public class EventSource extends Observable implements Runnable { // Subject
public void run() {
try {
final InputStreamReader isr = new InputStreamReader( System.in );
final BufferedReader br = new BufferedReader( isr );
while( true ) {
final String response = br.readLine();
setChanged(); // implementado en la clase Observable
notifyObservers(response); // implementado en la clase Observable
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.util.Observable;
import java.util.Observer;
public class ResponseHandler implements Observer { // Observer
private String resp;
public void update (Observable obj, Object arg) {
if (arg instanceof String) {
resp = (String) arg;
System.out.println("\nReceived Response: "+ resp );
}
}
}
• Contenido de la presentación:
• Desarrolladas en PowerPoint.