首页 > 其他 > 详细

设计模式学习——单例模式

时间:2020-02-20 16:58:42      阅读:58      评论:0      收藏:0      [点我收藏+]

获取单例模式的几种推荐方法

一、通过静态代码块来获取单例对象

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getSingleton();
        Singleton singleton2 = Singleton.getSingleton();
        //比较两个对象是否相等
        System.out.println(singleton1.hashCode());
        System.out.println(singleton2.hashCode());
    }
}

/**
 * 将要获取的单例对象
 */
class Singleton {
//单例模式中都要将构造方法设置为私有构造方法,避免通过new的方法来获取对象
    private Singleton() {
    }

    private static Singleton singleton;

    static {
        //静态代码块中创建对象
        singleton = new Singleton();
    }

    /**
     *  提供公有方法来获取单例对象
     */
    public static Singleton getSingleton() {
        return singleton;
    }
}

缺点:对内存消耗较大

推荐在单线程中,且能确定所有类的对象都会被创建时使用


多线程下推荐的创建单例的方法

二、通过双重检测来获取单例对象

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getSingleton();
        Singleton singleton2 = Singleton.getSingleton();
        //比较两个对象是否相等
        System.out.println(singleton1.hashCode());
        System.out.println(singleton2.hashCode());
    }
}

/**
 * 将要获取的单例对象
 */
class Singleton {
    //单例模式中都要将构造方法设置为私有构造方法,避免通过new的方法来获取对象

    private Singleton() {
    }

    private static volatile Singleton singleton;

    /**
     * 双重检测,保证多线程下的单例
     */
    public static Singleton getSingleton() {
        if(singleton == null) {
            synchronized (Singleton.class) {
                if(singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

三、通过静态内部类来创建单例对象

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getSingleton();
        Singleton singleton2 = Singleton.getSingleton();
        //比较两个对象是否相等
        System.out.println(singleton1.hashCode());
        System.out.println(singleton2.hashCode());
    }
}

/**
 * 将要获取的单例对象
 */
class Singleton {
    //单例模式中都要将构造方法设置为私有构造方法,避免通过new的方法来获取对象

    private Singleton() {
    }

    /**
     * 在静态内部类中创建单例对象
     */
    static class GetSingleton {
        private static final Singleton SINGLETON = new Singleton();
    }


    public static Singleton getSingleton() {
        return GetSingleton.SINGLETON;
    }
}

四、通过枚举的方法获取单例对象

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.INSTANCE;
        Singleton singleton2 = Singleton.INSTANCE;
        singleton1.say();
        //比较两个对象是否相等
        System.out.println(singleton1.hashCode());
        System.out.println(singleton2.hashCode());
    }
}


enum Singleton {
    /**
     * 将要获取的单例对象
     */
    INSTANCE;
    public void say() {
        System.out.println("hello world");
    }
}

设计模式学习——单例模式

原文:https://www.cnblogs.com/nyima/p/12335750.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!