【设计模式】单例模式

实现单例模式的四种方式:

1、懒汉模式

  懒汉模式,用到时才创建对象。所以存在线程安全隐患,可以在getInstance()方法前加synchroinzed关键字来设置成同步方法,这样就不会有线程安全问题,但是会降低效率。

/**
 * 懒汉模式
 */
class Singleton1 {
    private static Singleton1 singleton = null;

    private Singleton1() {
    }

    public static Singleton1 getInstance() {
        if (singleton == null) {
            singleton = new Singleton1();
        }
        return singleton;
    }
}

2、饿汉模式

  饿汉模式,内部创建了一个静态的对象。所以在类加载时就已经创建好了对象,不会出现线程安全问题。但是没有达到Lazy Loading(懒加载)的效果。如果从始至终都没有用到这个实例,则会造成内存资源的浪费。

/**
 * 饿汉模式
 */
class Singleton2 {
    private static final Singleton2 singleton = new Singleton2();

    private Singleton2() {
    }

    public static Singleton2 getInstance() {
        return singleton;
    }
}

 3、静态内部类模式

  静态内部类模式和饿汉模式类似。但是它解决了饿汉模式不是Lazy Loading的问题。这种模式并不会在Singleton3时立即被实例化,而是在调用getInstance()方法时,才会加载Creator来实例化Singleton3的一个实例。不仅线程安全,还延迟加载,效率高。

/**
 * 静态内部类模式
 */
class Singleton3 {
    private Singleton3() {
    }

    private static class Creator {
        private static final Singleton3 singleton = new Singleton3();
    }

    public static Singleton3 getInstance() {
        return Creator.singleton;
    }

}

 4、枚举模式

  枚举本身特性就是一个单例模式,但是在日常使用中很少用到。

/**
 * 枚举模式
 */
enum Singleton4 {
    SINGLETON4;
    public void show() {
        
    }
}

 

posted @ 2018-08-17 14:38  搬山巨猿  阅读(138)  评论(0)    收藏  举报