public static Logger2 GetInstance()
        {
            if (instance == null)
            {
                instance = new Logger2();
            }

            return(instance);
        }
        static void Main(string[] args)
        {
            // Singleton with Static field implementation
            // Logger1 a = new Logger1(); - cannot create a new Logger
            Logger1.GetInstance.LogMessage("Singleton with Static field.");

            // GetInstance() method returns the only single Logger2 instance
            Logger2.GetInstance().LogMessage("With  GetInstance()  method.");

            // Simple Thread safe implementation
            Logger3.GetInstance.LogMessage("Thread-safe implementation.");

            // Thread safety with double check
            Logger4.GetInstance.LogMessage("Thread-safety with double Check.");

            // Thread-safety without lock
            Logger5.GetInstance.LogMessage("Thread-safety without lock.");

            // Thread-safety without lock - using propertiy with lambda
            Logger5b.GetInstance.LogMessage("Thread-safety without lock - using propertiy with lambda");

            // Thread-safety without lock - with auto property
            Logger5c.GetInstance.LogMessage("Thread-safety without lock - with auto property");

            // Lazy instantiation with Lazy<T>
            Logger6.GetInstance.LogMessage("Lazy instantiation with Lazy<T> ");

            // Lazy instantiation with Nested classes
            Logger7.GetInstance.LogMessage("Lazy instantiation with Nested classes.");

            /***********************************************************************************/
            //GenericLogger
            Console.WriteLine("\r\n\r\nGeneric Logger:");
            FileLogger fileLoggerInstance = GenericLogger <FileLogger> .GetInstance();

            fileLoggerInstance.Log("Log a file with FileLogger.");

            EventLogger eventLoggerInstance = GenericLogger <EventLogger> .GetInstance();

            eventLoggerInstance.Log("Log an event with EventLogger.");

            /***********************************************************************************/

            Console.WriteLine("\r\n\r\nBadAssSingleton:");
            BadAssSingleton badAssSingleton = BadAssSingleton.OnlyInstance;

            badAssSingleton.LogMessage("Log Message.");
            badAssSingleton.Dispose();

            Console.Read();
        }