您的位置:首页 > 编程语言 > Java开发

java设计模式—单列模式

2016-06-25 00:03 441 查看
这个不管怎样对初学者来说都是要会写的!知道是一回事,写出来是另一回事!

这里列举的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设计模式