Java中的单例模式一般分为懒汉模式和饿汉模式,懒汉模式只有用得到的时候对象才初始化,饿汉模式无论用得到与否,都先初始化。

懒汉模式在运行的时候获取对象比较慢(因为类加载时并没有创建对象实例),但是加载类的时候比较快(因为此时不创建对象实例),饿汉模式是在运行的时候获取对象快(因为加载类时就创建了实例对象),加载类的时候慢(此时还需要创建实例对象)。

单例模式的应用场合,有些对象只需要一个的时候。

作用:保证整个应用程序中某个实例有且只有一个。

饿汉模式:

class SingletonDemo{
    /**
    *单例饿汉模式
    */

    //在单例类的内部声明一个自己本身的对象,并且初始化
    private static SingletonDemo s = new SingletonDemo();
    //私有化构造器
    private SingletonDemo(){
        
        }
        
    //获得单例的对象,必须static,不然无法调用该方法
    public static SingletonDemo getSingletonDemo(){
        return s;
        }
    public void eat(){
        System.out.println("在吃饭");
        }
    
    }
    
class TestSingletonDemo{
    public static void main(String[] args){
        //使用类名调用get方法得到在单例类内部所创建的对象
        /**使用类名时要确保get方法是static类方法,才可以使用类名调用方法,
        *使用类名调用方法,那就要调用类属性,也要是static修饰的属性
        */
        SingletonDemo s1 = SingletonDemo.getSingletonDemo();
        s1.eat();
        System.out.println(s1);
        
        SingletonDemo s2 = SingletonDemo.getSingletonDemo();
        s2.eat();
        System.out.println(s2);
        
        SingletonDemo s3 = SingletonDemo.getSingletonDemo();
        s3.eat();
        System.out.println(s3);
        
        }
    }

单例懒汉模式:

class Singleton{
    /**
    *懒汉模式
    */
    //将构造方法私有化,不允许外面直接创建对象
     private Singleton(){
         }
    //声明类的唯一对象,使用private static
    private static Singleton s;
    //给外部提供一个可以获得对象的方法,使用public static
    public static Singleton getSingleton(){
        if(s == null){
            s = new Singleton();
            }
        return s;
        }
}


class TestSingle{
    public static void main(String [] args){
        Singleton s = Singleton.getSingleton();
        System.out.println(s);
        
        
        Singleton s1 = Singleton.getSingleton();
        System.out.println(s1);
        
        
        Singleton s2 = Singleton.getSingleton();
        System.out.println(s2);
        
        
    }
    
}