Patrón de diseño Singleton, crear una instancia única. Este patrón de diseño sirve para crear una sola instancia de una clase, es decir que al tener un objeto creado se obtiene su instancia para su uso único y exclusivo, normalmente sirve para la carga de base de datos, repositorios etc…
Propiedades de la clase Singleton
Las siguientes son las propiedades de una clase singleton típica:
- Solo una instancia: la clase singleton tiene solo una instancia y esto se realiza proporcionando una instancia de la clase, dentro de la clase. Además, las clases externas y las subclases deben evitarse para crear la instancia.
- Accesible globalmente: la instancia de la clase singleton debe ser accesible globalmente para que cada clase pueda usarla.
Singleton
public class Singleton {
private static Singleton instance = null;
private Singleton(){
}
private synchronized static void createInstance() {
if (instance == null) {
instance = new Singleton();
}
}
public static Singleton getInstance() {
if (instance == null) createInstance();
return instance;
}
}
Su uso
val mSingleton = Singleton.getInstance()
Singleton con parametros
Es posible crear una clase que implemente la lógica de singleton permitiendo paso de parametros en su instancia.
SingletonHolder.kt
open class SingletonHolder<out T, in A>(private val constructor: (A) -> T) {
@Volatile
private var instance: T? = null
fun getInstance(arg: A): T {
return when {
instance != null -> instance!!
else -> synchronized(this) {
if (instance == null) instance = constructor(arg)
instance!!
}
}
}
}
Su implementación
En cada clase que se requiere que tenga una sola instancia (Singleton) y permita parametros genericos.
class MyManager private constructor(context: Context) {
fun doSomething() {
...
}
companion object : SingletonHolder<MyManager, Context>(::MyManager)
}
Su uso
MyManager.getInstance(context).doSomething()