您的位置:首页 > 移动开发 > Android开发

Android单例模式

2016-07-14 09:56 429 查看
最近几天抽空阅读了<<Android源码设计模式>>中单例模式,下面是我的阅读笔记.

单例模式就是在有的类中避免产生多个对象消耗过多的资源,必须保证只有一个实例存在,例如访问I/O和数据库等资源类.

实现单例模式主要有如下几个关键点:

1.构造函数不对外开放,一般为private

2.通过一个静态方法或者枚举返回单例类对象

3.确保单例类的对象有且只有一个,,尤其是在多线程huanjingxia

4.确保单例类对象在反序列化时不会从新构建对象.

下面是几种单例的demo:

</pre><pre name="code" class="java">/**
* 饿汉式:
*/
public class SingleTon0 {
private SingleTon0() {
}

private static final SingleTon0 single = new SingleTon0();

public static SingleTon0 getInstance() {
return single;
}
}
/**
* 懒汉式,优点:单例只有在使用时才会被实例化,在一定程度上节约了资源;
*        缺点:第一次加载时需要及时进行实例化,反应稍慢,每次调用getInstance都进行同步,造成不必要的同步开销
*/
class SingleTon1 {
private SingleTon1() {
}

private static SingleTon1 single;

public static synchronized SingleTon1 getInstance() {
if (null == single) {
single = new SingleTon1();
}
return single;
}
}
/**
* DCL模式
* 优点:既能节省资源又能保证线程安全,且单例对象初始化后调用getInstance不进行同步锁
* 缺点:第一次加载时反应稍慢,也由于java内存模型的原因偶尔会失败.
*/
class SingleTon2 {
private SingleTon2() {
}

private static SingleTon2 single;

public static SingleTon2 getInstance() {
if (null == single) {
synchronized (SingleTon2.class) {
if (null == single) {
single = new SingleTon2();
}
}
}
return single;
}
}
class SingleTon3 {
private SingleTon3() {
}

public static SingleTon3 getInstance() {
return SingleTonHolder.instance;
}

/**
* 静态内部类
* 优点:线程安全,保证单例唯一,同时延迟了单例的实例化,解决了DCL单例模式的缺点
    */
private static class SingleTonHolder {
private static final SingleTon3 instance = new SingleTon3();
}
}
/**
* 枚举类
*/
enum SingleTon4 {
INSTANCE;

public void doSomething() {
System.out.print("do thing");
}
}
/**
* 单例对象管理类
* 将多种单例类对象存放入单例管理类中同意管理,使用时通过key获取与之相对应的对象,他对用户隐藏了具体实现,降低了耦合度.
*/
class SingletonManager {
private static Map<String, Object> obj = new HashMap<>();

private SingletonManager() {
}

public static void registerService(String key, Object instance) {
if (!obj.containsKey(key)) {
obj.put(key, instance);
}
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};

public static Object getInstance(String key) {
return obj.get(key);
}

}


[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: