Android设计模式之单例模式

定义

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例 。

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需 要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让 类的实例去生成另一个唯一实例毫无意义。

其又分为三种形式

饿汉式

//只有内部类可以为static。
public class SingIn{
    //在自己内部定义自己的一个实例,只供内部调用
    private static final SingIn instance = new SingIn();
    private SingIn(){
    }
    //这里提供了一个供外部访问本class的静态方法,可以直接访问
    public static SingIn getInstance(){
        return instance;
    }
}

懒汉式

   /***
     * 一种常用的形式
     */
    private static SingIn instance = null; 
    public static synchronized SingIn getInstance() {         
      // 这个方法比上面有所改进,不用每次都进行生成对象,只是第一次  
      // 使用时生成实例,提高了效率!  
       if (instance == null)  
              instance = new SingIn();  
              return instance;  
    }  

双重锁式

//将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。 
private static volatile SingIn instance=null;
 private SingIn (){
 
 }
 public static  SingIn getInstance(){
    if(instance==null){
      synchronized(SingIn .class){
      if(instance==null){
        instance=new SingIn ();
       }
      }
     }
    return instance;
  }

使用方式,直接调用getInstance()方法即可得到对象。

优点

实例控制:Singln 会阻止其他对象实例化其自己的 Singln 对象的副本,从而确保所有对象都访问唯一实例

灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

缺点

开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销,可以通过使用静态初始化解决此问题。

可能的开发混淆:使用 Singln 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

对象的生存期:Singln 不能解决删除单个对象的问题。

原文地址:https://www.cnblogs.com/zhangqie/p/6408388.html