java设计模式之单例模式
单例模式的静态结构图
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以确保应用系统中一个类只能有一个实例被外部访问。
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
对于图中信息的解释:
Static uniqueInstance是singleton的唯一实例, static sharedInstance将把它返回客户端。通常,sharedInstance会检查uniqueInstance是否已经被实例化。
如果没有,它会生成一个实例然后返回uniqueInstance。(来源:百度百科)
单例模式的三种形式:
1懒汉式:也是常用的一种形式(线程不安全)
public class Singleton{ private static Singleton instance=null; public static synchronized Singleton getInstance() { if(instance==null) { instance=new Singleton(); } return instance; } private Singleton(){ } }
第二种形式:饿汉式(基于classloder机制避免了多线程的同步问题)
public static class Singleton{ //在自己内部定义自己的一个实例,只供内部调用 private static final Singleton instance = new Singleton(); private Singleton(){ //do something } //这里提供了一个供外部访问本class的静态方法,可以直接访问 public static Singleton getInstance(){ return instance; } }
第三种形式: 双重锁的形式(线程安全)
public static class Singleton{ private static Singleton instance=null; private Singleton(){} public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(null==instance){ instance=new Singleton(); } } } return instance; } }
单例模式的优点:
1,实例控制:阻止其他对象实例化其自己的单例对象副本,确保外部对象都只能访问该类的唯一实例。
2,灵活性:类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点:
1,开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题
2,存在的开发混淆:使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
3,对象的生存周期:不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),
其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。