单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。单例模式广泛应用于Android开发中,例如管理全局状态、缓存、日志记录、数据库连接等。
懒汉式:在需要时才创建实例,线程不安全。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}线程安全的懒汉式:使用同步方法保证线程安全。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}双重检查锁定:减少同步开销,保证线程安全。
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}优化后的双重检查锁定单例模式
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
if (instance != null) {
throw new IllegalStateException("Already initialized.");
}
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}防止反射创建实例
private Singleton() {
if (instance != null) {
throw new IllegalStateException("Already initialized.");
}
}实现Serializable接口并重写readResolve方法
import java.io.Serializable;
public class Singleton implements Serializable {
private static volatile Singleton instance;
private Singleton() {
if (instance != null) {
throw new IllegalStateException("Already initialized.");
}
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
protected Object readResolve() {
return getInstance();
}
}静态内部类
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}枚举单例
public enum Singleton {
INSTANCE;
public void doSomething() {
// 实例方法
}
}对象声明
object Singleton {
fun doSomething() {
// 实例方法
}
}伴生对象
class Singleton private constructor() {
companion object {
private var instance: Singleton? = null
fun getInstance(): Singleton {
if (instance == null) {
instance = Singleton()
}
return instance!!
}
}
}单例模式在Android开发中有广泛的应用,以下是一些常见的应用场景:
全局状态管理:例如管理用户会话、配置等。
public class UserManager {
private static UserManager instance;
private User user;
private UserManager() {}
public static UserManager getInstance() {
if (instance == null) {
instance = new UserManager();
}
return instance;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}网络请求管理:例如管理OkHttp的单例实例。
public class OkHttpClientManager {
private static OkHttpClientManager instance;
private OkHttpClient client;
private OkHttpClientManager() {
client = new OkHttpClient();
}
public static OkHttpClientManager getInstance() {
if (instance == null) {
instance = new OkHttpClientManager();
}
return instance;
}
public OkHttpClient getClient() {
return client;
}
}数据库管理:例如Room数据库的单例实例。
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static volatile AppDatabase INSTANCE;
public abstract UserDao userDao();
public static AppDatabase getInstance(Context context) {
if (INSTANCE == null) {
synchronized (AppDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "app_database")
.build();
}
}
}
return INSTANCE;
}
}单例模式是一种确保一个类只有一个实例并提供全局访问点的设计模式。它在Android开发中有着广泛的应用,如全局状态管理、网络请求管理和数据库管理等。通过合理使用单例模式,可以有效管理全局状态、减少资源消耗、提高应用的稳定性。然而,在使用单例模式时需要注意线程安全和资源释放问题,以避免潜在的内存泄漏和数据不一致性。希望本文的介绍能够帮助你更好地理解和应用shei