Acabando con el patrón singleton
Acabando con el patrón singleton
using std::cpp 2014
J. Daniel Garcia
Grupo ARCOS
Universidad Carlos III de Madrid
28 de Octubre de 2014
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
1/55
Acabando con el patrón singleton
Aviso
c Esta obra está bajo una Licencia Creative Commons
Atribución-NoComercial-SinDerivar 4.0 Internacional.
b Debes dar crédito en la obra en la forma especificada
por el autor o licenciante.
e El licenciante permite copiar, distribuir y comunicar pú-
blicamente la obra. A cambio, esta obra no puede ser
utilizada con fines comerciales — a menos que se ob-
tenga el permiso expreso del licenciante.
d El licenciante permite copiar, distribuir, transmitir y co-
municar públicamente solamente copias inalteradas de
la obra – no obras derivadas basadas en ella.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
2/55
Acabando con el patrón singleton
Introducción
1 Introducción
2 El patrón Singleton
3 Ejemplos en la biblioteca estándar
4 La sencillez de los singleton
5 Revisitando el patrón
6 Detalles
7 Conclusiones
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
3/55
Acabando con el patrón singleton
Introducción
Diseño de software
Existen dos formas de construir un diseño de
software: simplificándolo hasta el punto que resulte
obvio que no hay en el errores o complicándolo de tal
forma que los errores que haya en el no sean obvios.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
4/55
Acabando con el patrón singleton
Introducción
Diseño de software
Existen dos formas de construir un diseño de
software: simplificándolo hasta el punto que resulte
obvio que no hay en el errores o complicándolo de tal
forma que los errores que haya en el no sean obvios.
El primer método es mucho mas difícil.
Sir Tony Hoare, Premio Turing 1980.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
4/55
Acabando con el patrón singleton
Introducción
¿Importa el diseño?
¿Dónde te gustaría vivir?
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
5/55
Acabando con el patrón singleton
Introducción
Lenguajes de Patrones
1977: A Pattern Language: Towns, Buildings, Construction.
1979: The timeless Way of buildings.
Christopher Alexander.
Introduce las nociones de patrón y lenguaje de patrones.
Es un libro de arquitectura y edificación.
Buscaba definir reglas paso-a-paso para resolver
problemas comunes de ingeniería en la creación de
edificios y ciudades.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
6/55
Acabando con el patrón singleton
Introducción
GoF: The Gang of Four
1991: Gamma → Idea de patrones
software.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
7/55
Acabando con el patrón singleton
Introducción
GoF: The Gang of Four
1991: Gamma → Idea de patrones
software.
1993: GoF envían un catálogo de patrones
al ECOOP.
Design Patterns: Abstraction and Reuse
of Object-Oriented Design. E. Gamma, R.
Helm, R. Johnson, J. Vlissides. ECOOP,
LNCS 707, pp. 406–431.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
7/55
Acabando con el patrón singleton
Introducción
GoF: The Gang of Four
1991: Gamma → Idea de patrones
software.
1993: GoF envían un catálogo de patrones
al ECOOP.
Design Patterns: Abstraction and Reuse
of Object-Oriented Design. E. Gamma, R.
Helm, R. Johnson, J. Vlissides. ECOOP,
LNCS 707, pp. 406–431.
1995: Desing Patterns elements of
Reusable Object-Oriented Software.
Más de un millón de copias vendidas.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
7/55
Acabando con el patrón singleton
Introducción
GoF: Catálogo
Creación
Abstract Factory.
Builder.
Factory Method.
Prototype.
Singleton.
Estructural
Adapter.
Bridge.
Composite.
Decorator.
Facade.
Flyweight.
Proxy.
Comportamiento
Chain of Responsibility.
Command.
Interpreter.
Iterator.
Mediator.
Memento.
Observer.
State.
Strategy.
Template Method.
Visitor.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
8/55
Acabando con el patrón singleton
El patrón Singleton
1 Introducción
2 El patrón Singleton
3 Ejemplos en la biblioteca estándar
4 La sencillez de los singleton
5 Revisitando el patrón
6 Detalles
7 Conclusiones
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
9/55
Acabando con el patrón singleton
El patrón Singleton
Patrones de creación
Un patrón de creación ofrece flexibilidad sobre:
¿Qué debe crearse?
¿Quién lo crea?
¿Cómo se crea?
¿Cuándo se crea?
¿Quién lo destruye?
¿Cómo se destruye?
¿Cuándo se destruye?
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
10/55
Acabando con el patrón singleton
El patrón Singleton
Singleton
Intención: Asegurar que una clase tiene una única
instancia y ofrecer un punto de acceso global a la misma.
Aplicabilidad:
Debe haber exactamente una instancia de la clase, y debe
ser accesible a los clientes desde un punto de acceso bien
conocido.
Cuando una única instancia debe ser extensible (mediante
subclases) y los clientes deberían poder extender la
instancia sin modificar su código.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
11/55
Acabando con el patrón singleton
El patrón Singleton
Consecuencias
Acceso controlado a la única instancia
Encapsula la instancia y controla el acceso de los clientes.
Espacio de nombres reducido
Evita la polución del espacio de nombres con variables
globales.
Permite refinar operaciones y representación
Se puede subclasificar la clase singleton.
Permite un número variable de instancias
Se puede configurar un número distinto de 1 con cambios
mínimos.
Más flexible que operaciones de clase (estáticas)
Difícil de cambiar el diseño (poca flexibilidad).
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
12/55
Acabando con el patrón singleton
El patrón Singleton
Ejemplo canónico
single.h
#ifndef SINGLE_H
#define SINGLE_H
class singleton {
public:
static singleton ∗ instance() ;
void op1();
protected:
private:
singleton () ;
static singleton ∗ psing;
};
#endif
}
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
13/55
single.cpp
#include "single.h"
#include <iostream>
singleton ∗ singleton :: psing = nullptr;
singleton ∗ singleton :: instance() {
if (nullptr == psing) {
psing = new singleton;
}
return psing;
}
}
singleton :: singleton () {
std :: cout << "singleton () " << std :: endl;
void singleton :: op1() {
std :: cout << "op1()" << std :: endl;
Acabando con el patrón singleton
El patrón Singleton
Preguntas
¿Qué debe crearse?
Una única instancia del singleton.
¿Quién lo crea?
El cliente que necesita usar el singleton.
¿Cómo se crea?
Obteniendo acceso mediante instance.
¿Cuándo se crea?
En la primera invoacación a instance.
¿Quién lo destruye?
No se destruye.
¿Cómo se destruye?
No se destruye.
¿Cuándo se destruye?
No se destruye.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
14/55
Acabando con el patrón singleton
Ejemplos en la biblioteca estándar
1 Introducción
2 El patrón Singleton
3 Ejemplos en la biblioteca estándar
4 La sencillez de los singleton
5 Revisitando el patrón
6 Detalles
7 Conclusiones
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
15/55
Acabando con el patrón singleton
Ejemplos en la biblioteca estándar
errno
errno.h
extern int errno;
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
16/55
Acabando con el patrón singleton
Ejemplos en la biblioteca estándar
errno
errno.h
extern int errno;
errno.cc
int errno;
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
16/55
Acabando con el patrón singleton
Ejemplos en la biblioteca estándar
errno
errno.h
extern int errno;
errno.cc
int errno;
Código de usuario
//
...
}
c b e d –
}
}
void g() {
...
//
if (read(fd0, buffer , n) < 0) {
switch (errno) {
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
16/55
Acabando con el patrón singleton
Ejemplos en la biblioteca estándar
errno
errno.h
extern int errno;
errno.cc
int errno;
Código de usuario
void g() {
...
//
if (read(fd0, buffer , n) < 0) {
switch (errno) {
//
...
}
c b e d –
}
}
read.cc (simplificado)
ssize_t read(int fd, void ∗ buf, size_t nb) {
if (nbytes == 0) return 0;
if (fd < 0) {
errno = EBADF;
return −1;
}
if (buf == NULL) {
errno = EINVAL;
return −1;
}
errno = ENOSYS;
return −1;
}
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
16/55
Acabando con el patrón singleton
Ejemplos en la biblioteca estándar
Preguntas sobre errno
¿Qué debe crearse?
Una única instancia de errno.
¿Quién lo crea?
El enlazador.
¿Cómo se crea?
Accediendo a la variable de programa.
¿Cuándo se crea?
En arranque de programa.
¿Quién lo destruye?
No se destruye.
¿Cómo se destruye?
No se destruye.
¿Cuándo se destruye?
No se destruye.
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
17/55
Acabando con el patrón singleton
Ejemplos en la biblioteca estándar
Los singletons de la biblioteca estándar
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
18/55
Acabando con el patrón singleton
Ejemplos en la biblioteca estándar
Los singletons de la biblioteca estándar
iostream
namespace std {
extern istream cin;
extern ostream cout;
extern ostream cerr;
extern ostream clog;
static ios_base:: Init __ioinit ;
}
c b e d –
J. Daniel Garcia – ARCOS@UC3M (
[email protected])
18/55
Acabando con el patrón singleton
Ejemplos en la biblioteca estándar
Los singletons de la biblioteca estándar
globals_io.cc
iostream
namespace std {
extern istream cin;
extern ostream cout;
extern ostream cerr;
extern ostream clog;
static ios_base:: Init __ioinit ;
}
}
char alignas(istream) [sizeof(i
Comentarios de: Acabando con el patrón singleton (0)
No hay comentarios