【C#重构】——单例模式基础详解&在子父窗体之间的应用实例

单例模式

经典问题:工人多次进出工厂,怎么确定是同一个工厂里进行搬运货物?
问题原因:两次实例化同一个工厂,那么返回的工厂应该是同一个,但是得到的结果却是2个实例化的不同工厂。
改善目标:同一工厂使用多次(实例化多次),都走同一个工厂。

通常情况下我们是这些写的:

namespace 单例反例
{
    class Factory
    {
        static void Main(string[] args)
        {
            //实例化2次同一个工厂
            Factory工厂 s1 = new Factory工厂();
            Factory工厂 s2 = new  Factory工厂();


            //两次实例化后的对象结果对比
            if (s1 == s2) //如果相同,则说明同一工厂
            {
                Console.WriteLine("两个对象是相同的实例。");
            }
            else //如果不相同,则说明不是同一工厂
            {
                Console.WriteLine("两个对象是不相同的实例。");
            }
            Console.Read();
        }
    }
}
 class Factor工厂
    {
        //构造方法 公有public
        public Factor工厂()
        {

        }
    }

返回的结果是:两个对象是不相同的实例。

 class Factory
    {
        static void Main(string[] args)
        {
            Factory工厂 s1 = Factory工厂.GetInstance();
            Factory工厂 s2 = Factory工厂.GetInstance();

            if (s1 == s2)
            {
                Console.WriteLine("两个对象是相同的实例。");
            }
            else
            {
                Console.WriteLine("两个对象是不相同的实例。");
            }
            Console.Read();
        }
    }
 class Factory工厂
    {
        private static Factory工厂 instance;
        
        //构造方法 私有private,控制如上例子用new来创建爱你实例的可能
        private Factory工厂()
        {

        }
	
	//通过上面factory里的GetInstance()获得唯一的全局访问点
        public static Factory工厂 GetInstance()
        {
          //判断,实例是否存在,如果已经存在,返回已有实例,没有在new  Factory工厂()
            if (instance == null)
            {
                instance = new Factory工厂();
            }
            return instance;
        }
        
    }

返回结果是:两个对象是相同的实例。

小结一下:

单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问他的全局访问点

【C#重构】——单例模式基础详解&在子父窗体之间的应用实例

实际应用中的例子:
【产生的问题】:在父窗体加载子窗体的时候,如果多次点击加载子窗体的Button 可能会加载多次子窗体
【解决办法】:单例模式
父窗体:引用:using System.Runtime.InteropServices;
【C#重构】——单例模式基础详解&在子父窗体之间的应用实例
【C#重构】——单例模式基础详解&在子父窗体之间的应用实例
欢迎交流指正!