单例模式
单例模式保证了在程序运行的过程中,某个实现了单例模式的类只有一个实例。
实现方式
饿汉式
1
2
3
4
5
6
7
8
9
10public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
retun instance;
}
}- 优点:线程安全
- 缺点:类加载的时候就实例化静态对象,若程序运行过程不需用到该对象则浪费了资源
懒汉式
1
2
3
4
5
6
7
8
9
10
11
12
13public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance () {
if (instance == null) {
instatnce = new Singleton();
}
return instance;
}
}- 优点:延迟加载
- 缺点:线程不安全
懒汉式加锁
1
2
3
4
5
6
7
8
9
10
11
12
13public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static synchronized Singleton getInstance () {
if (instance == null) {
instatnce = new Singleton();
}
return instance;
}
}- 优点:延迟加载且线程安全
- 缺点:造成不必要的同步开销
双重锁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class Singleton {
private static Singleton instance = null;
private Singleton () {
}
public static Singleton getInstance () {
// If already initialized, no need to get lock everytime.
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}- 优点:延迟加载,解决了多余的同步,线程安全(两次判空,第一层是为了避免不必要的同步。 第二层是为了在instance为null的情况下创建实例)
静态内部类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class Singleton() {
private Singleton() {
}
public static Singleton getInstance () {
return SingletonHolder.instance;
}
/**
* 静态内部类,只有在装载该内部类时才会去创建单例对象
*/
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
}- 优点:利用Java虚拟机加载类的特性实现延迟加载和线程安全
建造者模式
如果一个类的构造需要很多参数,但是这些参数并不都是必须的,这种情况适合使用建造者模式,如
AlertDialog.Builder
。
观察者模式
如果想要在某个对象发生变化时立刻收到通知,则使用观察者模式,如各种点击监听事件,rxjava等。
原型模式
如果持有一个对象,想要快速获取一个相同属性的对象,则使用原型模式,常见的是实现
clone()
方法。
责任链模式
如果有一个任务从一个节点出发,沿着一条链不断传递,直到找到处理该任务的节点,则为责任链模式,如android的事件分发机制。
工厂模式
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。如
BitmapFactory
通过各种decodeXXX()
就可以从不同渠道获得Bitmap
对象。
策略模式
策略模式的精髓就在于,你传入一个类,后面的处理就能按照这个类的实现去做。以动画为例,设置不同的插值器对象,就可以得到不同的变化曲线。
适配器模式
适配器模式是作为两个不兼容的接口之间的桥梁。android中有各种
adapter
,主要就是适配数据在布局中的显示。
装饰器模式
装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。具体可参考装饰器模式。