Android单例模式详解

一、前期基础知识储备

(1) 设计模式定义:Design pattern,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式已于他人于系统都是多赢的;设计模式使代码编程真正工程化;设计模式是软件工程的基石脉络。
(2) 设计模式分类:设计模式总体上可以分为三种,即创建型模式、结构型模式、行为型模式,每种又可以具体分出子类,共计23种。今天我们要分析的单例模式就是创建型模式的一种。
(3) 创建型模式的来源及分类:社会化的分工越来越细,自然在软件设计方面也是如此,因此对象的创建和对象的使用分开也就成为必然趋势。因为对象的创建会消耗掉系统很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。一共有 6个创建型模式—简单工厂模式;工厂方法模式;抽象工厂模式;创建者模式,原型模式;单例模式

二、单例模式详解

(1) 单例模式定义:Java中单例模式定义:一个类有且仅有一个实例,并且自行实例化想整个系统提供。
(2) 单例模式关键点:①某个类只能有一个实例;②它必须自行创建这个示例;③它必须自行向整个系统提供这个实例。解决的问题—提供全局需要使用的,唯一的数据访问。
(3) 单例模式分类:① 懒汉式-在使用时做判断,如果需要再创建;② 饿汉式-在类加载时创建
①上代码,具体实现懒汉式
singleton 初始时没有初始化,只有当第一次调 getInstance() 时才创建实例。
public class Singleton {  
    private static Singleton singleton;  
    private Singleton(){}  
    public static synchronized Singleton getInstance(){  
        if(singleton==null){  
            singleton = new Singleton();  
        }  
        return singleton;  
    }  
};
②上代码,实现饿汉式
类默认先直接初始化一个实例,以后调用 getInstance() 总是返回这个已创建好的实例 
缺点:在没有必要获取实例时,已经预先产生了开销。
public class Singleton {  
    private static Singleton singleton = new Singleton();  
    private Singleton(){}  
    public static Singleton getInstance(){  
        return singleton;  
    }  
};
小结:单例线程模式线程安全问题:①懒汉式, 优点:使用时候才创建,资源节约; 缺点:为线程安全要付出额外的代价。②饿汉式, 优点:线程安全; 缺点:过早浪费资源。

三、单例模式进阶

实现线程安全懒汉式单例模式有三种方法:
①Sychronized方法
②双重检测锁模式
③内部类Holder式(推荐使用

上代码具体实现:
①/*加上synchronized,但是每次调用实例时都会加载**/  
 public static Singleton getInstance() {  
      synchronized (Singleton.class) {  
         if (instance == null) {  
             instance = new Singleton();  
         }  
     }  
     return instance;  
 }  
——————————————我是分隔线————————————————
②/*3.双重锁定:只在第一次初始化的时候加上同步锁*/  
  public static Singleton getInstance() {  
      if (instance == null) {  
          synchronized (Singleton.class) {  
              if (instance == null) {  
                  instance = new Singleton();  
              }  
          }  
      }  
      return instance;  
  }  
——————————————我是分隔线————————————————
③public class SingletonInner {    
//内部类实现单例模式 延迟加载,减少内存开销 
    private static class SingletonHolder {  
        private static SingletonInner instance = new SingletonInner();  
    }  
        private SingletonInner() {  
        }  
        public static SingletonInner getInstance() {  
        return SingletonHolder.instance;  
        }   
        protected void method() {  
        System.out.println("SingletonInner");  
    }  
} ;
总结:如果设计模式在编码设计生涯中用得极少,主要原因是对设计模式的理解还不够,认识不到问题的存在。希望这篇文章可以起到抛砖引玉的作用。

你可能感兴趣的:(基础知识)