JAVA设计模式之单例模式
2016-05-16 20:03
393 查看
单例模式:整个应用中保证只有一个类的实例存在。比如打印缓冲池和文件系统等。
于是我们很容易想到可以把类的构造函数写成私有的,然后提供方法可以返回一个静态的实例。
写法一:
评价:只要加载这个类,即使没有使用过,实例也会被创建。(这个缺点其实挺勉强的,既然创建了这个类为什么不使用呢?)
写法二:
评价:调用的时候再创建实例,但由于步骤的分离,为了线程安全需要加上同步化的关键字,同步化会让程序效率变低。
写法三:
评价:在写法二的基础上,只有instance == null的时候才加锁,所以提高了效率,但是感觉代码略显冗余。
写法四:
评价:在类的内部多实现了一个静态类,只在调用的时候才会创建实例,且不需要同步化,比较推荐使用。
于是我们很容易想到可以把类的构造函数写成私有的,然后提供方法可以返回一个静态的实例。
写法一:
package designPattern; public class SingletonClass { private static final SingletonClass instance = new SingletonClass(); public static SingletonClass getInstance() { return instance; } private SingletonClass() { } }
评价:只要加载这个类,即使没有使用过,实例也会被创建。(这个缺点其实挺勉强的,既然创建了这个类为什么不使用呢?)
写法二:
package designPattern; public class SingletonClass { private static SingletonClass instance = null; public synchronized static SingletonClass getInstance() { if(instance == null) { instance = new SingletonClass(); } return instance; } private SingletonClass() { } }
评价:调用的时候再创建实例,但由于步骤的分离,为了线程安全需要加上同步化的关键字,同步化会让程序效率变低。
写法三:
package designPattern; public class SingletonClass { private volatile static SingletonClass instance = null; public static SingletonClass getInstance() { if(instance == null) { synchronized(SingletonClass.class) { if(instance == null) { instance = new SingletonClass(); } } } return instance; } private SingletonClass() { } }
评价:在写法二的基础上,只有instance == null的时候才加锁,所以提高了效率,但是感觉代码略显冗余。
写法四:
package designPattern; public class SingletonClass { private static class SingletonClassInstance { private static final SingletonClass instance = new SingletonClass(); } public static SingletonClass getInstance() { return SingletonClassInstance.instance; } private SingletonClass() { } }
评价:在类的内部多实现了一个静态类,只在调用的时候才会创建实例,且不需要同步化,比较推荐使用。
相关文章推荐
- java画出爱心
- java发送地址(url)如何隐藏.action
- JAVA——静态导入
- Struts上传文件fileupload
- JavaCAS操作
- 正确理解Spring AOP中的Around advice
- mac下 如何进行spring mvc开发 基础篇 (环境搭建)
- ubuntu12.04+Eclipse+opencv环境搭建与配置
- java学习之路
- Java JSP(一) 基本原理和九个隐含对象
- 【转】java单例模式的实现
- Java 可变参数
- javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang
- Java基础知识-正则表达式
- 【Java】产生1-10的随机整数
- Java开发---包的访问权限
- Java开发--static,final,transient
- Java 开发---DOS 下运行java程序
- java开发-abstract类、final类
- MyEclipse插件