Java 设计模式之单例模式(一)

  • 定义:保证一个类有且仅有一个实例,并且提供一个访问它的全局访问点。
  • 在Android开发中单例模式的使用场景: 配置文件读写、网络请求操作、数据库操作、各种工具类等。
  • 使用意义:由于单例模式保证了只有一个实例,所以不需要频繁的创建和销毁对象,减少了内存资源的消耗提高了系统的性能,而且由于只有一个实例存在于内存中,可以避免对一个资源文件的同时写操作。
  • 使用时的注意事项:注意多线程情况下防止被多线程同时创建、由于生命周期较长,使用上下文参数Context时传入Activity或Fragment上下文参数会引起内存泄漏等问题。

 

  • 懒汉模式:在单线程下工作是没问题的,但是多线程情况下会出问题。

public class Singleton {
    private static Singleton singleton;
 
    // 构造函数私有化
    private Singleton () {}
 
    // 提供一个全局的静态方法
    public static Singleton getSingleton () {
        if (singleton== null) {
            singleton= new Singleton ();
        }
        return singleton;
    }
  • 恶汉模式:资源使用率不高,即使getSingleton()不会执行,但是该类仍然会初始化。

public class Singleton{

    // 在类被加载进入内存的时候就创建单一的Singleton对象
    public static final Singleton singleton= new Singleton();
 
    // 构造函数私有化
    private Singleton() {}
 
    // 提供一个全局的静态方法
    public static Singleton getSingleton() {
        return singleton;
    }
}
  • 优化后的懒汉模式:解决了多线程操作的问题,也避免了资源浪费。
public class Singleton{
    private static Singleton singleton;
 
    // 构造函数私有化
    private Singleton() {}
 
    // 提供一个全局的静态方法
    public static Singleton getSingleton() {
        if (singleton== null) {
            synchronized (Singleton.class) {
                if (singleton== null) {
            	    singleton= new Singleton();
                }
            }
        }
        return singleton;
    }
}
  • 静态内部类:调用getIntance()方法的时候,虚拟机才会加载SingleTonHoulder静态内部类,线程安全,保证单例的唯一性,延迟了对象的实例化。
public class SingleTon {
    //将构造函数私有化
    private SingleTon() {}
 
    public static SingleTon getInstance() {
        return SingleTonHoulder.singleTon ;
    }
 
    //静态内部类
    public static class SingleTonHoulder {
        private static final SingleTon singleTon = new SingleTon();
    }
}
  • 枚举实现:Android开发中不推荐使用(Enums ofter require more than twice as much memory as static constants. You should strictly avoid using enums on Android.)。
public enum Singleton{
    //定义一个枚举的元素,它就是Singleton的一个实例
    INSTANCE;
 
    public void toDO(){
        // do something ...
    } 
   

public static void main(String[] args){
   Singleton singleton = Singleton.INSTANCE;
   singleton.doSomething();
}
  • 使用容器统一管理:维护一个统一的管理类,注入多种单例类型,在使用时根据key获取对应类型的单例对象。
public class SingletonManager {

    //定义一个map容器
    private static Map<String, Object> objMap = new HashMap<>();
 
    private SingletonManager () {}

     //添加一个单例实例
    public static void addSingleton(String key, Object instance) {
        if (!objMap.containsKey(key)) {
            objMap.put(key, instance);
        }
    }
 
    //根据key得到一个单例实例
    public static getSingleton(String key) {
        return objMap.get(key);
    }
}
  • 这么多种单例模式,使用哪种方式可以根据项目本身来选择,对于Android开发来说通常很少有高并发的情况,所以使用哪种方式没有太大影响,个人推荐静态内部类实现方式,单例模式如需Context时,最好是使用Application 的Context。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值