关于单例模式
2016-01-10 19:04
232 查看
首先讲解一下概念:
通俗的说就是一个类就只能有一个实例。
单例模式的一些特点:
第一,只能有一个实例。
第二,必须由自己创建自己的唯一实例。
第三,这个实例是面向所有类的,任何类都可以使用。
第四,构造函数不对外开发,为私有。
第五,通过枚举或者静态方法返回单例的对象。
第六,反序列化的时候不会重新构建对象。
对于懒汉式,只有在用的时候才会被实例化,但是第一次加载的时候需要进行实例化,并且每次都要进行同步,造成不必要的同步的开销
以上有个共同的问题是当反序列化的时候可以重新创建对象,所以都不推荐
防止序列化
传承者(Inheritors)欢迎各位纠正错误,评论,吐槽!!!
通俗的说就是一个类就只能有一个实例。
单例模式的一些特点:
第一,只能有一个实例。
第二,必须由自己创建自己的唯一实例。
第三,这个实例是面向所有类的,任何类都可以使用。
第四,构造函数不对外开发,为私有。
第五,通过枚举或者静态方法返回单例的对象。
第六,反序列化的时候不会重新构建对象。
饿汉式单例模式
public class B { private static final B mB = new B(); //构造方法 private B(){ } //公有的静态函数,对外暴露获取单例对象的接口 public static B getB(){ return mB; } }
懒汉式单例模式
public class B { private static B mB; private B(){} public static synchronized B getMB(){ if(mB == null){ mB = new B(); } return mB; } }
对于懒汉式,只有在用的时候才会被实例化,但是第一次加载的时候需要进行实例化,并且每次都要进行同步,造成不必要的同步的开销
Double CheckLock(DCL)单例的实现
双重检查锁定check-lock-check-act,存在问题是:第一次加载反应慢,有时可能出现锁定失效问题。public class B { private static B mB = null; private B(){} public static B getMB(){ if(mB == null){ synchronized(B.class){ mB = new B(); } } return mB; } }
静态内部类单例模式
public class B { private B(){} public static B getMB(){ return Holder.mB ; } /** * 静态内部类 */ private static class Holder{ private static final B mB = new B(); } }
以上有个共同的问题是当反序列化的时候可以重新创建对象,所以都不推荐
防止序列化
private Object readResolve() throws ObjectStreamException{ return mB; }
枚举的单例
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。public enum SinletoEnum { INSTANCE; public void doSomething(){ //需要做的事 } }
传承者(Inheritors)欢迎各位纠正错误,评论,吐槽!!!
相关文章推荐
- Android性能优化典范
- fragment Trying to instantiate a class com.example.testhuanxindemo.MyFragment that is not a Fragmen
- java数据类型的种类以及存放的位置
- 看不懂的九宫格
- 内存泄漏整理
- live555介绍
- 这次想说说「SCP和SFTP」。
- 自从学了SQL编程,哪里不会点哪里!!!
- 【转】Oracle TYPE OBJECT 深入
- 【转】45 个非常有用的 Oracle 查询语句
- 【转】Oracle正则表达式函数
- 【转】Oracle 中的 FORALL 语句
- 【转】Oracle 树操作(select…start with…connect by…prior)
- 【转】oracle connect by用法
- 【转】Oracle的Replace函数与translate函数详解与比较
- 【转】plsql developer远程连接oracle数据库
- 【转】最强日期正则表达式
- 【转】验证E-mail、用户名、社保号、IP地址等10个实用的PHP正则表达式
- 【转】PL/SQL的ROWTYPE在insert和update语句里的妙用
- 【转】 linux系统的7种运行级别