java设计模式—单列模式
2016-06-25 00:03
441 查看
这个不管怎样对初学者来说都是要会写的!知道是一回事,写出来是另一回事!
这里列举的5种方式:饿汉式;懒汉式;双重检验锁;静态内部类;枚举
当然还有static{ } 区域内的初始化的数据
访问final 字段时…
//根据stormzhang的微信公众号总结的 张哥公众号干货够喝一大壶!哦!微信号是 googledev
观看刘欣讲解Effective java 后添加的内容
单例的范围:只作用在一个jvm中!如果有2个jvm都调用了同一个单例对象,则会产生2个地址不同的该单例对象!!!
如果单例对象被序列化了Serializable,那么单例就失效了!解决方法:就是在单例中添加 private Object ReadResolve(return instance对象;)——当然一般情况下单例的类不需要序列化…..
单例会让单元测试百年的困难…
这里列举的5种方式:饿汉式;懒汉式;双重检验锁;静态内部类;枚举
当然还有static{ } 区域内的初始化的数据
访问final 字段时…
public class Test { public static void main(String[] args) { Singleton single1 = Singleton.getInstance(); Singleton single2 = Singleton.getInstance(); System.our.println(single1 == single2 ) ---out: true } } class Singleton { //这种(饿汉式)适合--如果单列对象初始化快,占用内存小,可以在应用启动时加载并初始化; private static Singleton single = new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return single; } } //当单列初始化操作比较耗时,或占用内存大,一般不会使用,而是使用下面一种 class Singleton { //这种是(懒汉式)适合--按需延时加载单列 二者的区别在于(懒)是在将单例初始化操作延时到需要的时候才进行 //比如,单列用的擦数不多,单是提供的功能又复杂,加载和初始化操作要消耗大量资源 --使用方便! private static Singleton single = null; private Singleton(){ } public static Singleton getInstance(){ if(single == null ) { single = new Singleton(); } return single; } } //上面都适合单线程,在多线程的时候就需要同步锁了 class Singleton { //这种是双重校验锁 private static Singleton single null; private Singleton(){ } public static Singleton getInstance(){ if(single == null ) {//在这里加锁,如果之前已经实例化了就不必在执行synchronized下面的代码,提高性能 synchronized(Singleton.class){ single = new Singleton(); } } return single; } } //还有就是静态内部类 class Singleton { //这里是内部类,在装载该内部类时,才会得到单列对象 //只要应用不适用内部类JVM就不会去加载这个单列(这个现在还不太懂...) private static class InnerClass { public static Singleton single = new Singleton(); } private Singleton(){ } public static Singleton getInstance(){ return InnerClass.single;//得到单列对象 } public String doSomething(){ //do .... return "ssssss" ; } } //调用是时候直接 { String data = Singleton.getInstance().doSomething(); } //还有最后一个就是枚举 public enum Singleton{ //定义一个枚举元素,就是他自己的实例 instance; public void doSomething(){ //do.... } } //使用的时候 { Singleton single = Singleton.instance; single.doSomething(); }
//根据stormzhang的微信公众号总结的 张哥公众号干货够喝一大壶!哦!微信号是 googledev
观看刘欣讲解Effective java 后添加的内容
单例的范围:只作用在一个jvm中!如果有2个jvm都调用了同一个单例对象,则会产生2个地址不同的该单例对象!!!
如果单例对象被序列化了Serializable,那么单例就失效了!解决方法:就是在单例中添加 private Object ReadResolve(return instance对象;)——当然一般情况下单例的类不需要序列化…..
单例会让单元测试百年的困难…
相关文章推荐
- 我理解的--java 单例模式
- 我理解的--java工厂模式
- 我理解的--java建造者模式
- 我理解的--java组合模式
- 我理解的--java门面模式
- 我理解的--java策略模式
- 我理解的--java模板方法模式
- 我理解的--java观察者模式
- 我理解的--java备忘录模式
- 我理解的--java中介者模式
- Java设计模式(一) 简单工厂模式不简单
- Java设计模式(十一) 享元模式
- Java设计模式(二) 工厂方法模式
- 从赵本山的小品联想到的Java设计模式
- JAVA设计模式学习第三天 设计模式之Chain of Responsibility——项目篇
- 学习:java设计模式—工厂模式
- 设计模式----简单工厂模式
- Java设计模式 创建模式-工厂模式(Factory)
- Java设计模式 创建模式-原型模式(Prototype)