1.单例模式介绍
单例模式是应用最广的模式之一,单例对象的类必须保证只有一个实例存在.
2.单例模式的定义
确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例
3.单例模式的使用场景
确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个.
4.实现单例模式主要有如下几个关键点:
1.构造函数不对外开放,一般为private
2.通过一个静态方法或者枚举返回单例对象
3.确保单例类的对象有且只有一个,尤其是在多线程环境下
4.确保单例类对象在反序列化时不会重新构建对象
5.单例模式的实现方式
1.饿汉模式:
饿汉模式是在声明静态对象时就已经初始化
public class A{
private static final A a = new A();
private A(){}
public static A getA(){
return a;
}
}
2.懒汉模式
懒汉模式是声明一个静态对象,并且在用户第一次调用getInstance时进行初始化,
public class A{
privaye static A a;
private A(){}
public static synchroized A getInstance(){
if(a == null){
a = new A();
}
return a;
}
}
3.Double Check Lock (DCL) 实现单例
DCL方式实现单例模式的优点是既能在需要时才初始化单例,又能保证线程安全,且单例对象初始化后调用getInstance不进行同步锁
public class A {
private static A a = null;
private A(){}
public static A getInstance(){
if(a == null){
synchroized (A.class){
if(a == null){
a = new A;
}
}
}
return a;
}
}
DCL的优点:资源利用率高,第一次执行getInstance时单例对象才会被实例化,效率高.缺点:第一次加载时反应稍慢.
4.静态内部类单例模式
public class A{
private A(){}
public static A getInstance(){
return B.a;
}
/**静态内部类*/
private static class B{
private static final A a = new A();
}
}
5.使用容器实现单例模式
public class AManager{
private static Map<String,Object> objMap = new HashMap<>();
private AManager(){}
public static void registerService (String key,Object obj){
if(!objMap.containsKey(key)){
objMap.put(key,obj);
}
}
public static Object getService(String key){
return objMap.get(key);
}
}
6.单例模式的优点
1.由于单例模式在内存中只有一个实例,减少了内存开支
2.由于单例模式只生成一个实例,所以减少了系统的性能开销
3.单例模式可以避免对资源的多重占用
4.单例模式可以在系统设置全局的访问点优化和共享资源访问
7.单例模式的缺点:
1.单例模式一般没有接口,扩展困难,若要扩展,除了修改代码基本上没有第二种途径可以实现
2.单例对象如果持有Context,那么和容易引发内存泄漏,此时需要注意传递给单例等一下的Context最好是Application Context.
posted on 2016-05-17 15:21  小码农沐枫  阅读(226)  评论(0编辑  收藏  举报