设计模式 - 1 单例模式


设计模式之单例模式

1.     什么是单例模式

笼统的说就是一个类保证只创建一个实例,而且自行实例化并向整个系统提供实例。

2.     为什么要用单例模式

因为对于一些重量级资源重复创建的话不但占用资源,还浪费空间。比如一些Connection、FactoryBean。而与静态方法的区别是,我们不但使用静态方法还要使用非静态方法,但还要维护一份实例的时候,就需要单例模式了。

3.     单例模式的写法

3.1          懒汉


   public class SingleTon {

    private SingleTon(){}

    private static SingleTon singleTon = null;

    public static SingleTon getSingleTon(){
        if (singleTon==null){
            singleTon = new SingleTon();
        }
        return singleTon;
    }
}
3.2          懒汉(线程安全)


4.    public class SingleTon {

    private SingleTon(){}

    private static SingleTon singleTon = null;

    public static  synchronized SingleTon getSingleTon(){
        if (singleTon==null){
            singleTon = new SingleTon();
        }
        return singleTon;
    }
}

 

3.3  饿汉

  public class SingleTon {

    private SingleTon(){}

    private static SingleTon singleTon = new SingleTon();

    public static  synchronized SingleTon getSingleTon(){
        return singleTon;
    }
}

 

3.4  饿汉变异


public class SingleTon {

    private SingleTon(){}

    private static SingleTon singleTon = null;

    static {
        singleTon = new SingleTon();
    }

    public static  synchronized SingleTon getSingleTon(){
        return singleTon;
    }
}

 

3.5 静态内部类


public class SingleTon {

    private SingleTon(){}

    private static class SingletoHolder{
        private static final SingleTon instance= new SingleTon();
    }

    public static  synchronized SingleTon getSingleTon(){
        return SingletoHolder.instance;
    }
}

3.6 枚举


public enum SingleTonEnum {
    INSTANCE;
    private void whate(){}
}

3.7  双重锁校验

public class SingleTon {

    private SingleTon(){}

    private static SingleTon singleTon = null;

    public static SingleTon getSingleTon(){
        if(singleTon==null){
            synchronized (SingleTon.class){
                if (singleTon==null){
                    singleTon = new SingleTon();
                }
            }
        }
        return singleTon;
    }
}

 


区别:

懒汉不获取对象不创建实例。 加同步只是为了在多线程正常工作,但是效率太低

饿汉 第三和第四没多少区别,都是作为静态加载。

枚举推荐使用,而且能防止反序列化创建新对象

静态内部类,主要是在于只有调用getInstance才会去实例化,而如果用静态内部方法或者静态属性时,如果调用本类的其他方法,它也会实例化,所以造成不必要的浪费和麻烦。显然这样比第一和第二更加合理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值