android 单例设计模式,Android设计模式-单例模式

1.单例模式的定义

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

2.单例模式通用类型

6c109929a061

单例模式通用类型

Singleton类称为单例类,通过使用private的构造函数确保了应用中只产生一个实例。

单例模式通用代码

public class Singleton{

private static final Singleton singleton=new Singleton();

//限制产生多个对象

private Singleton(){

}

//通过该方法获取实例

public static Singleton getSingleton(){

return singleton;

}

}

3.单例模式其他常用实现方式

3.1 饿汉式(线程安全)

上面的通用模式,也被称为饿汉式单例

3.2懒汉式(线程不安全)

public class Singleton{

//不加final

private static Singleton singleton=null;

private Singleton(){

}

public static Singleton getSingleton(){

if (single == null) {

//在第一次调用getInstance()时才实例化,实现懒加载,所以叫懒汉式

single = new Singleton();

}

return single;

}

}

懒汉式对singleton对定义不能添加final修饰符

声明为final的变量,必须在类加载完成时已经赋值

就是,如果你是final非static成员,必须在构造器或者代码块或者直接定义赋值;

如果是final static 成员变量,必须直接赋值或者静态代码块中赋值。

3.3懒汉式(线程安全)

public class Singleton {

private Singleton() {

}

private static Singleton single = null;

//加上synchronized

public static synchronized Singleton getInstance() {

if (single == null) {

single = new Singleton();

}

return single;

}

}

相比于不安全的懒汉式,就是加了一个类锁

3.4DCL模式(双重检查锁定模式)

public class Singleton {

private volatile static Singleton singleton=null;

private Singleton() {

}

public static Singleton getSingleton() {

if (singleton == null) {

synchronized (Singleton.class) {

if (singleton == null) {

singleton = new Singleton();

}

}

}

return singleton;

}

}

volatile关键字能够保证可见性,被volatile修饰的变量,在一个线程中被改变时会立刻同步到主内存中,而另一个线程在操作这个变量时都会先从主内存更新这个变量的值。不过DCL中添加volatile最主要的应该是为了抑制重排序。如果只是单单的可见行,只加锁也是能解决问题的。

关于类锁,对象锁的问题自行百度吧

3.5静态内部类单例模式

public class SingleTon {

private SingleTon() {

}

public SingleTon getInstance(){

return SingleTonHolder.singleton;

}

private static class SingleTonHolder{

private static final SingleTon singleton=new SingleTon();

}

}

静态内部类单例的写法,当第一次类加载当时候,并不会导致初始化singleton,只有在第一次调用getInstance的时候才会初始化。

这种写法不仅能保证线程安全、单例对象的唯一性,同时也延迟类单例的实例化。

3.6枚举单例

public enum SingleTonA {

SINGLETONA;

//添加自己需要的操作

public void method(){

}

}

对于枚举。。。只记得刚开始入门的时候忘记从哪里看到一句,Android中尽量少用枚举,,,然后我就从来没有关注过枚举了,不过在单例的几种写法中,枚举是最安全的写法。其他写法通过反射或者反序列化,都可能会导致单例失效,但是枚举单例这种写法不会(原因是因为jdk内部实现的,当创建对象,如果判断出是枚举类型,则不会重新创建)。但是就我个人而言。。。可能是思想定势把,不爱用这个。。

4.使用单例模式可能会出现的泄漏问题

context泄漏

view泄漏

对于context泄漏,比如单例实例化的过程中,传入了一个activity的context,然后界面退出了,但是单例并没有销毁,则这个单例持有着activity的context,导致activity无法回收。解决方法可以传入application的context,或者在该activity退出的时候,置null。

对于view的泄漏,则可以使用弱引用,或同上置null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值