关闭

《Android源码设计模式解析与实战》读书笔记(二)

标签: android读书笔记设计模式
3656人阅读 评论(1) 收藏 举报
分类:

第二章、单例模式

单例模式应该是日常使用最为广泛的一种模式了。他的作用是确保某个类只有一个实例,避免产生多个对象消耗过多的资源。比如对数据库的操作时,就可以使用单例模式。

1.各种单例

(1)饿汉模式

public class Singleton {  
     private static Singleton instance = new Singleton();  
     private Singleton (){
     }
     public static Singleton getInstance() {  
     return instance;  
     }  
 }  

这种写法是在类装载时就实例化instance,他避免了多线程的同步问题。但是不能保证有别的方式去装载,没有达到懒加载。

(2)懒汉模式(线程不安全)

public class Singleton {  
      private static Singleton instance;  
      private Singleton (){
      }   
      public static Singleton getInstance() {  
      if (instance == null) {  
          instance = new Singleton();  
      }  
      return instance;  
      }  
 }  

达到了懒加载,但是在多线程不能正常工作。

(3)懒汉模式(线程安全)

public class Singleton {  
      private static Singleton instance;  
      private Singleton (){
      }
      public static synchronized Singleton getInstance() {  
      if (instance == null) {  
          instance = new Singleton();  
      }  
      return instance;  
      }  
 }  

这种写法能够在多线程中很好的工作,但是每次调用getInstance方法都会进行同步,反应稍慢,还会造成不必要的开销,所以者这种不建议使用。

(4)DCL单例(双重检查锁定)

public class Singleton {  
      private volatile static Singleton singleton;  
      private Singleton (){
      }   
      public static Singleton getSingleton() {  
      if (singleton == null) {  
          synchronized (Singleton.class) {  
          if (singleton == null) {  
              singleton = new Singleton();  
          }  
         }  
     }  
     return singleton;  
     }  
 }  

这种写法在getSingleton方法中对singleton进行了两次判空,第一次是为了不必要的同步,第二次是为了在null的情况下创建实例。我们会发现上面代码有一个volatile关键字,因为在这里会有DCL失效问题,原因是Java编译器允许处理器乱序执行。那么为了解决这个问题,在JDK1.5之后,具体化了volatile关键字,只要定义时加上他,可以保证执行的顺序,虽然会影响性能。这种方式第一次加载时会稍慢,在高并发环境会有缺陷,但是一般能够满足需求。

(5)静态内部类单例模式

public class Singleton {  
      private Singleton (){
      }
      public static final Singleton getInstance() {  
          return SingletonHolder.INSTANCE;  
      } 
      /**
      *静态内部类
      */
      private static class SingletonHolder {  
      private static final Singleton INSTANCE = new Singleton();  
      }   
  }  

这种是推荐使用的单例模式实现方式。当第一次加载Singleton类时并不会初始化INSTANCE,只有在第一次调用getInstance方法时才会导致INSTANCE被初始化。这种方式不仅能够保证线程安全,也能保证单例对象的唯一性,同时也延长了单例的实例化。

(6)枚举单例

public enum Singleton {  
     INSTANCE;  
     public void whateverMethod() {  
     }  
 }  

这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。

(7)使用容器实现单例模式

public class SingletonManager { 
  private static Map<String, Object> objMap = new HashMap<String,Object>();

  private Singleton() { }
  public static void registerService(String key, Objectinstance) {
    if (!objMap.containsKey(key) ) {
      objMap.put(key, instance) ;
    }
  }

  public static ObjectgetService(String key) {
    return objMap.get(key) ;
  }
}

将多种单例类型注入到一个统一的管理类中,在使用时根据key获取对象对应类型的对象。这种方式使得我们可以管理多种类型的单例,并且在使用时可以通过统一的接口进行获取操作,降低了用户的使用成本,也对用户隐藏了具体实现,降低了耦合度。

2.Android源码中的单例模式

在Android系统中,我们经常会通过Context获取系统级别的服务,如WindowsManagerService、ActivityManagerService等,更常用的是一个LayoutInflater的类,这些服务会在合适的时候以单例的形式注册在系统中,在我们需要的时候就通过Context的getSystemService(String name)获取。

3.总结

优点:

(1)由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁的创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。
(2)单例模式可以避免对资源的多重占用,例如一个文件操作,由于只有一个实例存在内存中,避免对同一资源文件的同时操作。
(3)单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如,可以设计一个单例类,负责所有数据表的映射处理。

缺点:

(1)单例模式一般没有接口,扩展很困难,若要扩展,只能修改代码来实现。
(2)单例对象如果持有Context,那么很容易引发内存泄露。此时需要注意传递给单例对象的Context最好是Application Context。

10
1
查看评论

Android源码设计模式解析与实战——面向对象六大原则(一)

最近在看《Android源码设计模式解析与实战》,希望通过记笔记,监督自己,也方便以后查询。
  • wyl850503
  • wyl850503
  • 2016-09-12 14:35
  • 237

Android 源码设计模式解析与实战 完整版带书签目录.pdf

  • 2017-09-15 10:24
  • 134.30MB
  • 下载

何红辉关爱民-Android源码设计模式解析与实战(带书签高清版).pdf

  • 2017-08-04 20:04
  • 134.30MB
  • 下载

Android源码设计模式解析与实战.PDF(完整版)

  • 2016-07-01 11:45
  • 48B
  • 下载

《Android源码设计模式解析与实战》读书笔记(二十六)

第二十六章、MVP应用构架模式1.MVP介绍 MVP模式是MVC模式的一个演化版本,MVP全称Model-View-Presenter。目前MVP在Android应用开发中越来越重要了。 在Android中,业务逻辑和数据存取是紧紧耦合的,很多缺乏经验的开发者很可能会将各种各样的业务逻辑塞进某个...
  • qq_17766199
  • qq_17766199
  • 2016-01-27 08:58
  • 5662

《Android源码设计模式解析与实战》读书笔记(十)

第十章、解释器模式 解释器模式是一种用的比较少的行为型模式,其提供了一种解释语言的语法或表达式的方式。但是它的使用场景确实很广泛,只是因为我们自己很少回去构造一个语言的文法,所以使用较少。
  • qq_17766199
  • qq_17766199
  • 2015-12-23 09:08
  • 2144

Android 源码设计模式解析与实战 第2版 读书笔记1.2开闭原则

本文依赖《Android源码设计模式解析与实战》, 读书笔记编号与原书同步 1.2开闭原则(OCP) 定义:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是对于修改是封闭的。 理解:一个单词  @Override 这一原则要求尽量...
  • cswoods
  • cswoods
  • 2017-09-27 21:18
  • 43

《Android源码设计模式解析》读书笔记——Android中你应该知道的设计模式

断断续续的,《Android源码设计模式解析》也看了一遍,书中提到了很多的设计模式,但是有部分在开发中见到的几率很小,所以掌握不了也没有太大影响。 我觉得这本书的最大价值有两点,一个是从设计模式的角度去理解Android源码,结合着日常开发中的常用类,对设计模式的理解会更加的深刻;另外一个...
  • bz419927089
  • bz419927089
  • 2015-12-13 18:03
  • 14937

《Android源码设计模式解析与实战》读书笔记(二十一)

第二十一章、装饰模式 装饰模式也称为包装模式,是结构型设计模式之一。装饰模式是一种用于替代继承技术的一种方案。 1.定义动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
  • qq_17766199
  • qq_17766199
  • 2016-01-16 11:31
  • 1758

Android源码设计模式分析项目

原文链接:https://github.com/simple-android-framework/android_design_patterns_analysisAndroid源码设计模式分析开源项目该系列文章已经重新深度整理并出版该系列文章已经根据技术发展、实战需求以及读者您的反馈重写所有章节,并...
  • axi295309066
  • axi295309066
  • 2016-12-24 21:04
  • 1162
    个人资料
    • 访问:217038次
    • 积分:3260
    • 等级:
    • 排名:第12367名
    • 原创:70篇
    • 转载:10篇
    • 译文:0篇
    • 评论:228条
    多多支持
    博客专栏
    最新评论