注释1:对象实例化三步我这里做一个比喻,某个公司给员工分配一间寝室(指的就是在堆中开辟了空间)然后呢给房子进行一些标配比喻分个空调、洗衣机什么的(对象初始化),在然后呢把钥匙给到员工手里(对象进行赋值)。
3:饿汉模式面试官又问你知道饿汉模式怎么写的吗,小明一听:哦饿汉,不就是很着急自己马上进行实例化,生怕自己无法实例化吗,这个简单马上写了一个饿汉
public class Singleton { private static Singleton singleton=new Singleton(); public static Singleton getSingleton() { return singleton; } }
面试官一看确实不错。
4:内部类模式小明一看上面的模式,自己突发奇想,饿汉模式着急创建对象,在加载时候消耗性能,而懒汉模式又存在线程安全问题(优化后没有了)能不能结合一下呢,突然告诉面试官我还有一个比较好的方式来实现,然后他写了下面代码
1 public class Singleton { 2 private static class SingletonManager{ 3 private final static Singleton SINGLETON=new Singleton(); 4 public final static Singleton getSingleton() 5 { 6 return SingletonManager.SINGLETON; 7 } 8 }
面试官一看,不错不错,既保证了懒加载,同时也保证了线程安全问题。
5:使用场景面试官又问小明,那么你知道使用场景吗,小明想了想说,既然在应用程序中只有一个单例,那么势必是用于共享资源,比喻数据库连接池,线程池等都可以用单例模式。
6:单例模式和静态类区别面试官继续问:静态类同样也是产生一个对象,和单例具有高度相似你知道他们区别吗,小明回答说
1:面向对象中有三大特性继承,封装和多态,但是静态类是不可以继承的,所以从oo角度来说静态类并不符合面向对象,他们的类是不可以被覆盖,所以灵活性要比单例差的多
2:由于静态类的特殊他在编译器已经进行实例化了并不能提供懒加载模式
3:对于项目中如果进行单元测试,由于方法不能覆盖同样为测试带来了困难
4:由于静态类在编译器已经都被实例化,所以要比单例性能要快,如果只需要执行一些静态方法这个时候可以采用静态类
7:总结单例模式看似简单,其实用起来还要考虑到很多问题,现在我把这个过程基本总结了,当然可能还有不足之处,欢迎指正。