设计模式——单例模式

  • 饿汉模式
package test.design.singleton;

/**
 * 单例模式(饿汉模式)
 * 使用场景:当类只有一个实例,且可以从一个固定的点访问时,保证实例只有一个
 * 优点:在类加载时就完成了初始化,线程安全
 * Created by Z on 2017/4/17.
 */
public class EagerSingleton {

    //静态变量
    private static EagerSingleton eagerSingleton = new EagerSingleton();

    /**
     * 私有构造函数
     * 不允许被外部所创建 保证只有一个实例
     */
    private EagerSingleton() {
        System.out.println("GetInstance");
    }

    public static EagerSingleton getInstance() {
        return eagerSingleton;
    }

    public void print() {
        System.out.println("This is EagerSington");
    }

}

 class Test {

    public static void main(String[] args) {
        EagerSingleton.getInstance().print();
        System.out.println(EagerSingleton.getInstance());

//        这样就会报错 因为构造函数是私有的不允许被外部创建
//        EagerSingleton es =new EagerSingleton();
    }
}

输出:

GetInstance
This is EagerSington
test.design.singleton.EagerSingleton@4a574795
  • 懒汉模式
package test.design.singleton;

/**
 * 单例模式(懒汉模式)
 * 使用场景同饿汉模式
 * 优点:在使用时加载,节省内存
 * Created by Z on 2017/4/17.
 */
public class LasySingleton {

    private static LasySingleton lasySingleton = null;

    private LasySingleton() {
        System.out.println("GetInstance");
    }

    /**
     * 线程同步
     * 不加synchronized线程是不安全的
     * @return
     */
    public static synchronized LasySingleton getInstance() {
        if (lasySingleton == null) {
            lasySingleton = new LasySingleton();
        }
        return lasySingleton;
    }

    public void print() {
        System.out.println("This is LasySingleton");
    }
}

class TestLasySingleton {
    public static void main(String[] args) {
        LasySingleton.getInstance().print();
        System.out.println(LasySingleton.getInstance());

//        这样就会报错 因为构造函数是私有的不允许被外部创建
//        LasySingleton ls =new LasySingleton();

    }
}

输出:

GetInstance
This is LasySingleton
test.design.singleton.LasySingleton@4a574795
//和上一个分配的内存地址是一样的...
  • 总结

   饿汉模式:空间换时间;懒汉模式:时间换空间。一般用饿汉模式就可以了。

原文地址:https://www.cnblogs.com/6324/p/6723808.html