// Este es el método estático que controla el acceso a la instancia del singleton. // En la primera ejecución, crea un objeto singleton y colocalo // en el campo estático. En ejecuciones posteriores, devuelve el objeto // existente almacenado en el campo estático. public static SingletonIngenuo GetInstancia() { if (_instancia == null) { _instancia = new SingletonIngenuo(); } return(_instancia); }
public static void Run() { Console.WriteLine("-------------------------"); Console.WriteLine(" SINGLETON PATTERN "); Console.WriteLine("-------------------------"); Console.WriteLine(" SINGLETON INGENUO "); SingletonIngenuo s1 = SingletonIngenuo.GetInstancia(); SingletonIngenuo s2 = SingletonIngenuo.GetInstancia(); if (s1 == s2) { Console.WriteLine("El singleton funciona, ambas variables contienen la misma instancia."); } else { Console.WriteLine("El singleton falló, las variables contienen instancias diferentes."); } Console.WriteLine("\n"); Console.WriteLine(" SINGLETON THREAD SAFE "); Console.WriteLine( "{0}\n{1}\n\n{2}\n", "Si ves el mismo valor, entonces es que el Singleton ha sido reutilizado (bien!)", "Si ves valores distintos, entonces es que se han creado 2 Singletons (mal!)", "RESULTADO:" ); Thread proceso1 = new Thread(() => { TestSingleton("FOO"); }); Thread proceso2 = new Thread(() => { TestSingleton("BAR"); }); proceso1.Start(); proceso2.Start(); proceso1.Join(); proceso2.Join(); Console.Write("\n"); }