单例模式

单例模式

  

  设计目的:想在系统中只能出现一个类的实例

  特点:私有构造函数;类内部维护一个实例;生成一个静态获取实例的方法(延迟加载实例)

  实现方式:双重检测方式;静态内部类方式;枚举类实现

双重检测方式

package com.commonCode.singleton;

/**
 * Created by Demrystv.
 */
public class Singleton1 {
    //最原始版,采用双重检测
    private Singleton1() {
    }

    private volatile static Singleton1 instance;

    public static Singleton1 getInstance() {

        //如果实力已经创建,则不进行下面的同步
        if (instance == null){
            //开始同步,防止不需要创建实例的线程进行同步,降低性能
            synchronized (Singleton1.class){
                //如果被同步的线程中,有一个线程创建了对象,那么别的线程就不用继续创建
                if (instance == null){
                    instance = new Singleton1();
                }
            }
        }
        return instance;
    }
}

静态内部类

package com.commonCode.singleton;

/**
 * Created by Demrystv.
 */
public class Singleton2 {

    //单例的实例被声明成static和final变量,在第一次加载类到内存中时就会初始化
    //所以创建实例本身就是线程安全的
    //SingletonHolder的存在又使得Singleton2具备延时加载的特点
    private static class SingletonHolder{
        private static final Singleton2 INSTANCE = new Singleton2();
    }

    private Singleton2() {
    }

    public static final Singleton2 getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

枚举类实现

package com.commonCode.singleton;

/**
 * Created by Demrystv.
 */
public enum Singleton3 {

    //枚举类
    INSTANCE;

    private String string = name();

    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }

    public void test(){
        System.out.println("开始测试");
    }
}
原文地址:https://www.cnblogs.com/Demrystv/p/9420705.html