设计模式

一:单例模式

单例模式:是一种对象创建型模式,用来确保程序中一个类最多只有一个实例,并提供访问这个实例的全局点

单例模式解决以下类似问题:

  • 如何样保证一个类只有一个实例?
  • 如何轻松地访问类的唯一实例?
  • 一个类如何控制它的实例化?
  • 如何限制一个类的实例数量?

单例模式的解决方案:

  • 隐藏类的构造方法,用private修饰符修饰构造方法.
  • 定义一个public的静态方法(getInstance()) ,返回这个类唯一静态实例。

2. 适用场景

以下场景可使用单例模式:

  • 某些管理类,保证资源的一致访问性。
  • 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
  • 工具类对象;
  • 频繁访问数据库或文件的对象。

Android:

  • Context.getSystemService()

  • KeyguardUpdateMonitor.getInstance(mContext)

  • Calendar.getInstance()

  • ....

其他:

  • 日志操作类
  • 文件管理器
  • 数据库的连接尺
  • ...

3.实现方式

3.1 饿汉式

饿汉式,故名思议,很饿,所以在类加载的时候就直接创建类的实例。

/**
 * Singleton class. Eagerly initialized static instance guarantees thread safety.
 */
public final class Singleton {

  /**
   * Private constructor so nobody can instantiate the class.
   */
  private Singleton() {}

  /**
   * Static to class instance of the class.
   */
  private static final Singleton INSTANCE = new Singleton();

  /**
   * To be called by user to obtain instance of the class.
   *
   * @return instance of the singleton.
   */
  public static Singleton getInstance() {
    return INSTANCE;
  }
}

优点:

  • 多线程安全

缺点:

  • 内存浪费,类加载之后就被创建了实例,但是如果某次的程序运行没有用到,内存就被浪费了。

小结:

  • 适合:单例占用内存比较小,初始化时就会被用到的情况。

  • 不适合:单例占用的内存比较大,或单例只是在某个特定场景下才会用到

3.2 懒汉式

​ 懒汉式,故名思议,很懒,需要用的时候才创建实例。

/**
 * Singleton class. Eagerly initialized static instance guarantees thread safety.
 */
public final class Singleton {

  /**
   * Private constructor so nobody can instantiate the class.
   */
  private Singleton() {}

  /**
   * Static to class instance of the class.
   */
  private static final Singleton INSTANCE = null;

  /**
   * To be called by user to obtain instance of the class.
   *
   * @return instance of the singleton.
   */
  public static Singleton getInstance() {
    if (INSTANCE == null){
        INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}

优点:

  • 多线程安全

缺点:

  • 执行效率低,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低要改进。

小结:

  • 不建议使用此方法,后续介绍其他方法可兼顾内存和多线程安全.

3.4 线程安全的双重检查

优点:

  • 多线程安全

注意点:

  • jdk 1.5以下多线程安全不能实现

小结:

  • 可使用此方法,兼顾内存和多线程安全.

3.5 静态内部类

优点:

  • 多线程安全

注意点:

  • jdk 1.5以下多线程安全不能实现

小结:

  • 可使用此方法,兼顾内存和多线程安全.

二:代理模式

链接:http://blueskykong.com/2017/02/22/designproxy/

三:策略模式

链接:http://blueskykong.com/2017/03/22/designstrategy/

四:工厂模式

链接:https://juejin.im/post/5a6eaf0f5188257341082f74

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值