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