El patrón Singleton es un patrón de diseño de software que restringe la creación de instancias de una clase a solo «una» instancia. Se utiliza en las aplicaciones de Android cuando un elemento debe crearse solo una vez y usarse en todos los ámbitos. La razón principal de esto es que la creación repetida de estos objetos consume recursos del sistema. Por lo tanto, el objeto idéntico solo debe crearse una vez y usarse repetidamente. Se utiliza en situaciones en las que solo necesitamos una única instancia de la clase, como con servicios de red, bases de datos, etc. Por lo tanto, creamos una clase singleton para implementar el patrón Singleton en nuestro proyecto o producto. En este artículo, veremos cómo crear clases singleton en Java y Kotlin.
Ventajas del Patrón Singleton
Muchos objetos en una aplicación normal de Android solo requieren una única instancia global, ya sea que se usen directamente o simplemente se pasen a otra clase. Los ejemplos incluyen cachés, la clase de repositorio, Retrofit, Gson, OkHttpClient, HttpLoggingInterceptor y SharedPreferences. Si tuviéramos que instanciar más de uno de estos tipos de objetos, encontraríamos problemas como el comportamiento inexacto de la aplicación, el uso de recursos y otros resultados inesperados.
Propiedades de la clase Singleton
Las características de una clase singleton típica se enumeran a continuación:
- Solo una instancia: la clase singleton solo tiene una instancia, lo que se logra al ofrecer una instancia de clase dentro de otra clase. Además, debería ser imposible que las clases y subclases externas creen la instancia.
- Accesible globalmente: cada clase debe poder usar la instancia de clase singleton, ya que debe ser accesible globalmente.
Reglas para hacer una clase única
Para crear una clase Singleton, se deben cumplir las pautas que se enumeran a continuación:
- Un constructor privado
- Una referencia estática de su clase.
- Un método estático
- Referencia de objeto accesible globalmente
- Coherencia en varios subprocesos
Ejemplo de singleton con inicialización diferida de subprocesos múltiples
Java
public class singleTonExample { private static volatile singleTonExample INSTANCE = null; private singleTonExample() {} public static singleTonExample getInstance() { if(INSTANCE == null) { synchronized (singleTonExample.class) { if (INSTANCE == null) { INSTANCE = new singleTonExample(); } } } return INSTANCE; } }
Kotlin
class singleTonExample { @Volatile private var INSTANCE: singleTonExample? = null fun getInstance(): singleTonExample? { if (INSTANCE == null) { synchronized(this) { if (INSTANCE == null) { INSTANCE = singleTonExample() } } } return INSTANCE } }
La palabra clave volatile hace que esta instancia de singleton sea segura para subprocesos con un constructor privado, y estamos realizando dos comprobaciones de «es igual a nulo» en el método getInstance. Por ejemplo, si tenemos dos hilos A y B, solo uno de ellos podrá ingresar al bloque sincronizado y ambos observarán que la instancia es nula en la palabra clave sincronizada. Ahora, A entra mientras B espera, y cuando A nota que la instancia es nula, A creará una nueva instancia y dejará el bloque. Cuando el subproceso B ingrese, notará que la instancia no es nula y luego tendrá la instancia creada por la propia amenaza A.
Conclusión
Aprendió sobre el patrón Singleton en Android en este breve tutorial, incluido qué es, por qué es útil, cómo usarlo en su propio código y algunas estrategias para manejar muchos subprocesos.
Publicación traducida automáticamente
Artículo escrito por sarthakhanda y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA