设计模式,1/23,单例模式
顾名思义,只有一个实例的模式。
禅那本书举了个好例子,皇帝,这应该单独写一个类,但是应该是唯一的,只有一个实例,不能让人随便new出很多个来。
解决方法就是限制构造函数的权限,本来new对象就是用构造函数的,既然构造函数不能访问了,那自然就不能new对象了。
但是又不能一个实例都没有,所以:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Singleton { 2 private static final Singleton singleton = new Singleton(); 3 4 private Singleton() {} 5 6 public static Singleton getInstance() { 7 return singleton; 8 } 9 10 public static void doSomething() { 11 //blahblahblah 12 } 13 }
直接在类里面存一个自己的实例,然后用一个静态方法来获取它。
这样别人没办法用这个类new对象,如果需要实例,那就用getInstance()来取。
建议一则:
其他的方法尽量定为静态方法,不然是这样的:
Singleton.getInstance().do();
脱裤子放屁,明明可以:
Singleton.do();
另外单例模式有线程安全的问题,等以后碰到这个问题再说吧。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Singleton { 2 private static Singleton singleton = null; 3 4 private Singleton() {} 5 6 public static Singleton getInstance() { 7 if (singleton == null) { 8 singleton = new Singleton(); 9 } 10 11 return singleton; 12 } 13 14 public static void doSomething() { 15 //blahblahblah 16 } 17 }
一个线程刚判断完还没来得及new对象,另一个线程也开始判断而且通过了,就出现了两个对象。
解决方法见折叠标题,不过没验证过,将来再说啦。