设计模式

140 阅读3分钟

单例模式

双重检查模式 (DCL)

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

静态内部类单例模式

第一次加载Singleton类时不会初始化instance,只有在第一次调用getInstance()方法时,虚拟机会加载SingletonHolder类,初始化instance。

这种方式既保证线程安全,单例对象的唯一,也延迟了单例的初始化,推荐使用这种方式来实现单例模式。

public class Singleton { 
    private Singleton(){
    }
    public static Singleton getInstance(){  
        return SingletonHolder.sInstance;  
    }  
    private static class SingletonHolder {  
        private static final Singleton sInstance = new Singleton();  
    }  
} 

枚举单例

线程安全,调用效率高,不能延时加载

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

参考

单例模式的七种写法

责任链模式

优点

  • 降低耦合度。它将请求的发送者和接收者解耦。

缺点

  • 不能保证请求一定被接收。
  • 如果处理者太多那么遍历必定会影响性能。

问题

责任链和事件分发的区别

工厂方法模式

定义

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。

优点

  • 依赖抽象不要依赖具体类
  • 一个调用者想创建一个对象,只要知道其名称就可以了。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

使用

  • 登录模块 QQ,微信,微博,账号
  • 数据存储 本地保存,SharedPreferences, 数据库
  • 计步 加速度器 计步器

观察者模式

定义

  • 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

优点

  • 观察者和被观察者是抽象耦合。
  • 增强系统灵活性,可扩展性。

缺点

  • 运行效率:一个观察者卡顿,会影响整体的执行效率,一般考虑异步方式。
  • 开发效率:开发,调试会比较复杂。

使用

  • adapter
  • click点击
  • 接口回调

装饰者模式

定义

  • 动态的给一个对象添加一些额外的职责。就增加功能来说,装饰者模式相比较子类更加灵活。防止子类过多。

优点

  • 装饰类和被装饰类可以独立发展,不会相互耦合,
  • 多用组合少用继承,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点

  • 多层装饰比较复杂。

使用

  • ContextWrapper 装饰者
  • ContextImpl 被装饰者

问题

装饰者和代理模式

  • 装饰者模式应该为所装饰的对象增强功能
  • 代理模式对代理的对象施加控制.并不会对代理对象功能增强。

模板方法模式

  • Activity的生命周期