设计模式:单例模式
单例模式
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
1. 具体实现
- ① 懒汉模式
- ② 饿汉模式
public final class Singleton{
// ① 懒汉模式
private static Singleton instance = null;
// ② 饿汉模式
// private static Singleton instance = new Singleton();
private Singleton(){
//将构造方法设置为私有类型(private),使得Singleton类不能从外部实例化。
}
public static getInstance(){
// ① 懒汉模式
return instance == null ? instance = new Singleton() : instance;
// ② 饿汉模式
// return instance;
}
pubic void gosky(){
System.out.println("I'm Galaxy Captain");
}
}
public static void main(String[] args){
//调用
Singleton.getInstance().gosky();
}
示例代码中①表示懒汉模式使用方法,②表示饿汉模式使用方法。
2. 详细说明
懒汉模式与饿汉模式的区别在于初始化的时机,饿汉模式在类加载时进行初始化,懒汉模式则在调用时才进行初始化。所以说饿汉模式通过牺牲了一定的空间,换取了时间。
单例模式在多线程并发环境下是不安全的,所以应该通过加锁的方式来确保同步。
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
单例模式通过判断是否已经实例化过来实现类的唯一性,单例模式实例化的对象将一直保持在内存中,直到手动将instance等于null后,才会被回收。
3. 在Android的使用
- 在Application类中使用单例模式。
- 在各大组件直接保持数据的一致性,使用单例模式在全局保持一致的数据。例:从相册选择数据后,使用单例传递数据传递。
- 因为单例模式会自己持有自己的强引用,所以不会被GC回收,所以请注意在恰当的实际主动释放资源。毕竟Android给每个进程的内存少的可怜。
4. 更多
- Singleton类是如何持有自己的?
- 通过单例模式看Java类加载机制和static修饰符
5. 感谢
- 看过的博客的博主们,github的大神们