首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >设计模式之单例模式

设计模式之单例模式

作者头像
用户11397231
发布2024-12-18 20:07:54
发布2024-12-18 20:07:54
2170
举报
文章被收录于专栏:算法算法

单例模式

背景

单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。单例模式广泛应用于Android开发中,例如管理全局状态、缓存、日志记录、数据库连接等。

单例模式的优点

  1. 节约资源:单例模式确保一个类只有一个实例,减少内存开销,节约系统资源。
  2. 全局访问:提供全局访问点,方便在不同的组件中共享实例。
  3. 控制实例数量:避免了多个实例带来的数据不一致性问题。

实现单例模式

Java中的单例模式实现

懒汉式:在需要时才创建实例,线程不安全。

代码语言:javascript
复制
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

线程安全的懒汉式:使用同步方法保证线程安全。

代码语言:javascript
复制
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

双重检查锁定:减少同步开销,保证线程安全。

代码语言:javascript
复制
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;
    }
}

优化后的双重检查锁定单例模式

代码语言:javascript
复制
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;
    }
}

防止反射创建实例

代码语言:javascript
复制
private Singleton() {
    if (instance != null) {
        throw new IllegalStateException("Already initialized.");
    }
}

实现Serializable接口并重写readResolve方法

代码语言:javascript
复制
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();
    }
}

静态内部类

代码语言:javascript
复制
public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

枚举单例

代码语言:javascript
复制
public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // 实例方法
    }
}
Kotlin中的单例模式实现

对象声明

代码语言:javascript
复制
object Singleton {
    fun doSomething() {
        // 实例方法
    }
}

伴生对象

代码语言:javascript
复制
class Singleton private constructor() {
    companion object {
        private var instance: Singleton? = null

        fun getInstance(): Singleton {
            if (instance == null) {
                instance = Singleton()
            }
            return instance!!
        }
    }
}

单例模式在Android中的应用

单例模式在Android开发中有广泛的应用,以下是一些常见的应用场景:

全局状态管理:例如管理用户会话、配置等。

代码语言:javascript
复制
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的单例实例。

代码语言:javascript
复制
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数据库的单例实例。

代码语言:javascript
复制
@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;
    }
}

注意事项

  1. 线程安全:在多线程环境下,确保单例模式的实现是线程安全的。
  2. 资源释放:在应用退出或不再需要单例实例时,及时释放资源,避免内存泄漏。
  3. 避免反序列化破坏单例:使用枚举单例可以防止反序列化创建新实例的问题。

总结

单例模式是一种确保一个类只有一个实例并提供全局访问点的设计模式。它在Android开发中有着广泛的应用,如全局状态管理、网络请求管理和数据库管理等。通过合理使用单例模式,可以有效管理全局状态、减少资源消耗、提高应用的稳定性。然而,在使用单例模式时需要注意线程安全和资源释放问题,以避免潜在的内存泄漏和数据不一致性。希望本文的介绍能够帮助你更好地理解和应用shei

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单例模式
    • 背景
    • 单例模式的优点
    • 实现单例模式
      • Java中的单例模式实现
      • Kotlin中的单例模式实现
    • 单例模式在Android中的应用
    • 注意事项
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档