参考文献:
http://c.biancheng.net/view/1338.html
https://www.runoob.com/design-pattern/singleton-pattern.html

单例模式 Singleton
一、特点:
1.单例类只有一个实例对象
2.该对象必须由单例类自行创建
3.对外提供一个访问该单例类的全局访问点

二、创建单例模式的两种方式:懒汉、饿汉

三、注意new与getInstance的区别:
大部分类都可以用new来产生一个新对象
getInstance用来生成唯一实例,返回值为该类的一个对象
语法: 类名 对象名 = 类名.getInstance();

四、demo

public class TestDemo{  
    public static void main(String args[]) {
        President zt1 = President.getInstance(); //必须这么创建,SingleObject object = new SingleObject();会报错
        zt1.getName();    //输出总统的名字
        President zt2 = President.getInstance();//再生成一个实例
        zt2.getName();    //输出总统的名字
        if (zt1 == zt2) {
            System.out.println("他们是同一人!");
        } else {
            System.out.println("他们不是同一人!");
        }
    }
}
class President{
    private static volatile President instance = null;
    private President() {   //很关键!!!让构造函数为 private,这样该类就不会被实例化
        System.out.println("产生一个总统");
    }
    public static synchronized President getInstance() {    //获取唯一可用的对象
        if (instance == null) {
            instance = new President();
        }
        else {
             System.out.println("已经有一个总统,不能产生新总统!");
        }
        return instance;
    }
//加线程锁synchronize的单例模式可以保证线程安全,能够在多线程中很好的工作,但是,效率很低,99% 情况下其实不需要同步。
//优点:第一次调用才初始化,避免内存浪费。
//缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。

    public void getName() {
         System.out.println("baideng");
    }
}

运行结果:
图片说明