Introducció al Patró Singleton
El patró Singleton és un dels patrons creacionals més coneguts i utilitzats en el desenvolupament de programari. La seva principal funció és assegurar que una classe tingui només una instància i proporcionar un punt d'accés global a aquesta instància.
Característiques del Patró Singleton
- Única Instància: Garanteix que només hi hagi una instància de la classe.
- Accés Global: Proporciona un punt d'accés global a aquesta instància.
- Control de la Creació: Controla la creació de l'objecte per evitar múltiples instàncies.
Avantatges del Patró Singleton
- Control Centralitzat: Facilita el control centralitzat de recursos.
- Reducció de Recursos: Evita la creació de múltiples instàncies, reduint així l'ús de recursos.
- Facilitat d'Accés: Proporciona un punt d'accés global fàcilment accessible.
Desavantatges del Patró Singleton
- Dificultat en les Proves: Pot dificultar les proves unitàries, ja que és difícil substituir la instància única.
- Problemes de Concurrència: Pot presentar problemes en entorns multithreading si no es gestiona correctament.
- Acoblament: Pot augmentar l'acoblament entre classes, ja que moltes dependran de la instància única.
Implementació del Patró Singleton
Exemple en Java
A continuació, es mostra una implementació bàsica del patró Singleton en Java:
public class Singleton {
// Instància única de la classe
private static Singleton instance;
// Constructor privat per evitar la instanciació externa
private Singleton() {}
// Mètode públic per obtenir la instància única
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
// Mètode de demostració
public void showMessage() {
System.out.println("Hola des del Singleton!");
}
}Explicació del Codi
- Instància Única: La variable
instanceés una instància estàtica de la classeSingleton. - Constructor Privat: El constructor és privat per evitar que altres classes puguin crear una nova instància de
Singleton. - Mètode
getInstance: Aquest mètode retorna la instància única de la classe. Si la instància no existeix, la crea. - Mètode de Demostració:
showMessageés un mètode de demostració per mostrar un missatge.
Exemple en Python
A continuació, es mostra una implementació bàsica del patró Singleton en Python:
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
def show_message(self):
print("Hola des del Singleton!")
# Ús del Singleton
singleton = Singleton()
singleton.show_message()Explicació del Codi
- Instància Única: La variable
_instanceés una instància estàtica de la classeSingleton. - Mètode
__new__: Aquest mètode controla la creació de la instància. Si_instanceésNone, crea una nova instància. - Mètode de Demostració:
show_messageés un mètode de demostració per mostrar un missatge.
Exercicis Pràctics
Exercici 1: Implementació del Patró Singleton en C#
Implementa el patró Singleton en C# i crea un mètode que mostri un missatge.
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton Instance {
get {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public void ShowMessage() {
Console.WriteLine("Hola des del Singleton!");
}
}
// Ús del Singleton
class Program {
static void Main(string[] args) {
Singleton singleton = Singleton.Instance;
singleton.ShowMessage();
}
}Solució
- Instància Única: La variable
instanceés una instància estàtica de la classeSingleton. - Constructor Privat: El constructor és privat per evitar que altres classes puguin crear una nova instància de
Singleton. - Propietat
Instance: Aquesta propietat retorna la instància única de la classe. Si la instància no existeix, la crea. - Mètode de Demostració:
ShowMessageés un mètode de demostració per mostrar un missatge.
Exercici 2: Singleton amb Multithreading en Java
Implementa el patró Singleton en Java assegurant que sigui segur en entorns multithreading.
public class ThreadSafeSingleton {
private static volatile ThreadSafeSingleton instance;
private ThreadSafeSingleton() {}
public static ThreadSafeSingleton getInstance() {
if (instance == null) {
synchronized (ThreadSafeSingleton.class) {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
}
}
return instance;
}
public void showMessage() {
System.out.println("Hola des del Singleton segur per a threads!");
}
}
// Ús del Singleton
class Main {
public static void main(String[] args) {
ThreadSafeSingleton singleton = ThreadSafeSingleton.getInstance();
singleton.showMessage();
}
}Solució
- Instància Única Volàtil: La variable
instanceés una instància estàtica i volàtil de la classeThreadSafeSingleton. - Constructor Privat: El constructor és privat per evitar que altres classes puguin crear una nova instància de
ThreadSafeSingleton. - Mètode
getInstance: Aquest mètode retorna la instància única de la classe. Utilitza un bloc sincronitzat per assegurar que només una instància es crea en entorns multithreading. - Mètode de Demostració:
showMessageés un mètode de demostració per mostrar un missatge.
Resum
El patró Singleton és una solució efectiva per assegurar que una classe tingui només una instància i proporcionar un punt d'accés global a aquesta instància. Tot i que té avantatges com el control centralitzat i la reducció de recursos, també presenta desavantatges com la dificultat en les proves i els problemes de concurrència. La seva implementació pot variar segons el llenguatge de programació, però els principis bàsics es mantenen constants.
Curs de Patrons de Disseny de Programari
Mòdul 1: Introducció als Patrons de Disseny
- Què són els Patrons de Disseny?
- Història i Origen dels Patrons de Disseny
- Classificació dels Patrons de Disseny
- Avantatges i Desavantatges d'Usar Patrons de Disseny
Mòdul 2: Patrons Creacionals
Mòdul 3: Patrons Estructurals
Mòdul 4: Patrons de Comportament
- Introducció als Patrons de Comportament
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
Mòdul 5: Aplicació de Patrons de Disseny
- Com Seleccionar el Patró Adequat
- Exemples Pràctics d'Ús de Patrons
- Patrons de Disseny en Projectes Reals
- Refactorització Usant Patrons de Disseny
Mòdul 6: Patrons de Disseny Avançats
- Patrons de Disseny en Arquitectures Modernes
- Patrons de Disseny en Microserveis
- Patrons de Disseny en Sistemes Distribuïts
- Patrons de Disseny en Desenvolupament Àgil
