目录
前言
正式开始学习设计模式了,看了几个视频,学习了单例模式,但仍是不知道单例模式到底是什么,想起了老师给我推荐了一本书《大话设计模式》,我去瞧一瞧之后发现它的不同,这是一部以故事带来的教学,不生硬,让我感到惊喜,因此想在此记录下来我的收获。
故事主人公:小菜(是真的小菜,不过比我强)和大鸟(大佬)。
正文
第一个故事:
这里小菜每点击一次工具箱都会创建一个新的对象,因此就会出现多个窗口,但是小菜只想要一个呀!那么怎么解决这种问题呢?我也在想怎么才能只有一个呢?答案在下面哦!
哇,原来就是一个逻辑判断,只有该对象为null的时候才会让工具箱显示,也就是说对象已经存在了的话就不会再显示工具箱了!是不是已经解决了呢?我和小菜一样知足了,然后大鸟就抛出了一堆BUG,我能理解小菜了,或许刚入职的我就是这样,,
换做我本人,也会脱口而出:不会。。。。
这里让我明白了写方法还是很重要滴!另外我去看了dispose方法是关闭窗体,并释放一部分资源。也就是说对象没有被删掉,啊哦。。
还有问题还有问题,小菜怎么可能那么简单就过关呢?
我来想想小菜现在判断了(解决对象重复创建)isnull,(检查对象状态)isdisposed还有新创了个方法(代码复用)。
下面还会有啥?
我只能说:不是很懂。这是我和小菜当时的共同想法。
不过看完代码之后我理解了:生和不生是自己的责任,同样的交报告也是自己的责任,那这个对象什么时候实例化,也应该是自己的责任。以后我写代码的时候如果遇到一个类在实例化的时候需要考虑判断条件的话不能写在别的地方而是在对应类自己的代码下完成判断与构造!讲的真好!
给自己加个注意点:
构造方法私有,不通过构造方法实例化对象,而是通过其他方法返回对象,那个方法也用来判断是否应该创建该对象。
我悟了!小菜也悟了!
单例模式
含义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
(别学了之后看到啥都用,要分情况来的!这是我对自己说的。)
“通常我们可以让一个全局变量访问一个对象,但是它不能防止你实例化多个对象,一个最好的方法就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。【DP】”
但我咋觉得就算私有化还是会被反射暴力破解。。不过就算能被破解至少安全了不少。下面是一个案例。
再看一下大鸟大佬对单例模式的见解。
单例模式,对唯一实例的受控访问。不过上面的代码还是有问题的,我们继续学习吧!
在多个线程同时访问该类调用GetInstance方法的时候有可能创建多个实例,于是有个锁!我想这是不是刚刚我看不懂的视频里面的DCL饿汉式!哦不DCL懒汉式!
不过我就是单方面的觉得大佬说的很好,我赞成我喊666,小菜居然有疑问。
我不如小菜,实锤。。。看看下一段对话。
打扰了!我看到下一个标题才知道上面的不是DCL懒汉式。。。
“我有问题!我在外面已经判断了instance是否存在了,咋还要判断。”我和小菜问道!
我懂了,我悟了!
双重锁定 DCL(Double-Check Locking) 。大鸟,讲的牛!
下面大鸟讲了C语言中的静态初始化,我就简单理解一下。
静态初始化的方式是在自己被加载时就将自己实例化,所以被形象的称为饿汉式单例类,我们上面讲的呢是要在第一次被引用时将自己实例化,它被形象的称为懒汉式实例类,比起来是懒了~~~
下面是C里面的静态初始化。
我看懂了:具体使用哪一种要看实际的需求嘿嘿。
不过我还是不太能明白啥需求要用饿汉啥需求用懒汉。
斗胆猜一下,饿汉要提前占用系统资源,所以我们可以把必定会用到的类和对象用饿汉式;
懒汉不用提前创建,但好麻烦,一般情况下我还是饿汉去吧,除非对象占用资源太多了。。。
结言
由于这本书是C语言版的,我学习的是Java所以对于这里没提到反射不好评价,不过无所谓,至少我真的真的明白了单例模式!感谢《大话设计模式》!