单例模式
双重检查模式 (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的生命周期