单例模式

Posted xie-qi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

单例模式:使类只有一个实例对象的设计模式称为单例模式。

单例模式作用:1)节省内存空间 2)业务需求(有些类必须只有一个实例)

单例的实现的几个步骤:

1)构造方法私有化(别人不能通过new来创建这个对象)

2)在类的内部创建单例对象

3)通过public方法提供这个单例对象

 

单例模式的实现方式:

1)饿汉模式(简单);

package singleton;

/**
 * 饿汉模式
 */
public class Test1 {
    //2、创建唯一的对象
    private static final Test1 test1=new Test1();
    /**
     * 1、构造方法私有化
     */
    private Test1(){

    }
    //3、写一个public方法提供该对象
    public static Test1 getInstance(){
        return test1;
    }
    public void test(){
        System.out.println("test方法");
    }
}

2)懒汉模式:使用的时候再去创建对象;

package singleton;

/**
 * 懒汉模式
 */
public class Test2 {
    //2、创建唯一的对象
    private static Test2 test2;
    /**
     * 1、构造方法私有化
     */
    private Test2(){

    }
    //3、懒汉模式,在调用getInstance方法时,才会去创建这个对象
    public static synchronized Test2 getInstance(){
        if (test2==null){
            test2= new Test2();
        }
        return test2;
    }
    public void test(){
        System.out.println("test方法");
    }
}

3)双重检查锁定:解决懒汉模式性能问题;

package singleton;
/**
 *  双重检查锁定
 * @author bigpeng
 * @create 2020-06-28-17:36
 */
public class Test3 {
    // 2.创建唯一的对象
    // volatile 关键字作用 :使对象的变化对其他的线程可见。
    private volatile static Test3 test3;

    /**
     * 1.构造方法私有化
     */
    private Test3(){

    }
    /**
     * 3、双重检查锁定,在调用getInstance方法时,才去创建这个对象
     * @return
     */
    public static  Test3 getInstance(){
        if(test3 ==null){//只有第一次并发访问时,能进入if
            synchronized (Test3.class) {
                if(test3==null) {
                    test3 = new Test3();
                }
            }
        }
        return test3;
    }
    public void test(){
        System.out.println("test方法");
    }

}

4)枚举(推荐);

package singleton;

/**
 * 枚举类型实现单例,不能被反射创建和反序列化创建
 * @author bigpeng
 * @create 2020-06-28-18:05
 */
public enum Test4 {
    TEST4;//定义唯一的实例对象
    private Test4(){
    }
    public void test(){
        System.out.println("枚举单例的方法");
    }
}
package singleton;

public class Test {
    public static void main(String[] args) {
        Test1 instance = Test1.getInstance();
        instance.test();
        Test1 instance2 = Test1.getInstance();
        System.out.println(instance==instance2);//true

        //获取枚举对象
        Test4 test4 = Test4.TEST4;
        test4.test();
    }
}

 

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块