单例设计模式:

单例设计模式一般用于只有一个实例的程序中,当然也可以用于控制实例个数

1、饿汉式单例设计模式

public class SingleTon {
    private static SingleTon singleTon = new Singleton();
    private SingleTon()
    {}
}

由于属性singleTon是静态的,故此,在初始化的时候虚拟机会优先加载静态属性,所以singleTon在类最初载入虚拟机时就被初始化,保证了一定会有此实例。再加上我们将构造方法进行了私有化,限制了其余类对本类进行实例化。以上便是单例设计模式的饿汉式。

缺点:当我们使用本类中的方法,不需要对象的时候,也会创建一个单例,导致性能降低。

有点:此方法安全性高,只有一种方式创建对象。

此种方式只为单例而单例,就想饿汉一样,只为吃,故此此种方式被称为饿汉式单例设计模拟 

2、懒汉式单例设计模式

public class SingleTon {
    private static SingleTon singleTon = null;
    private SingleTon(){};
    public static SingleTon getInstance()
    {
        if (singleTon == null)
        {
            singleTon = new SingleTon();
        }
        return singleTon;
    }
}

同上,此种方式在最初始的时候加载了一个为空的本类对象,也就是说,在虚拟机加载本类的时候只是单纯的为本类对象分配了一个空间,而在我们需要此类的时候就只有通过getInstance接口进行对象的获取,且只有一个对象,这种在除了必要的工作以外,完全不考虑其他的问题的方式被称为懒汉式。

缺点:当我们有多个线程的同时申请此对象的时候,a线程在申请的时候判断singleTon为空,在创建对象的途中,b对象也申请了此对象,也判断为空,但是a对象在已经在创建的同种,故此,会出现两个实例被创建。所以此种方式不安全。

优点:因为在我们未调用接口之前,我们的singleTon是空的,虚拟机并不会去新建一个对象,我们同时可以使用本类其他方法,也就是说,我们并没有消耗多余的资源,故此,此方法性能高。

3、内部类单例设计模式

public class SingleTon {

    private SingleTon(){};
    private static class SingleTonHolder{ 
         private static SingleTon singleTon = new SingleTon();
    }
    public static SingleTon getInstance()
    {
         return SingleTonHolder.singleTon;
    }
}

在虚拟机中,加载类的时候,并不会加载静态内部类,也就是说,我们在本类中使用除申请对象方法外,并不会创建本类对象,

其次,我们在申请本类对象的时候并没有任何判断,内部类中的本类对象创建是静态私有的,外部类并没有修改本类对象的权限,也就是说我们的本类对象时不可修改的,安全的,并不会存在多次创建问题。故此静态内部类单例设计模式是安全的,高兴能的。

顺带收一下虚拟机类加载的顺序:静态属性-->静态方法-->语句块-->构造方法-->普通属性-->普通方法-->普通内部类,静态内部类。