单例设计模式

单例设计模式

1.某个类只能有一个实例

构造器私有化

2.它必须自行创建这个实例

​ 含有一个该类的静态变量来保存这个唯一的实例

3.它必须自行向整个系统提供这个实例

​ 对外提供获取该实例对象的方式

常见的有如下几种形式
1.饿汉式:在类初始化时直接创建对象,不存在线程安全问题。

public class Singleton {

    //自行创建,并用静态变量保存
    final static Singleton INSTANCE = new Singleton1();//直接创建,不管是否需要此对象

    //构造器私有化
    private Singleton1(){
    }
}

2.懒汉式:延迟创建对象
2.1 线程不安全,适用于单线程

public class Singleton1 {

    static Singleton1 instance;//用静态变量保存这个唯一的实例
   private Singleton1(){// 静态方法私有化

   }

   public static Singleton1 getInstance(){//提供一个静态方法,获取这个实例
       if(instance == null){
           instance = new Singleton1();
       }
       return instance;
   }
}

2.2 线程安全(适用于多线程)

public class Singleton1 {

    static Singleton1 instance;//用静态变量保存这个唯一的实例
    private Singleton1(){// 静态方法私有化

    }

    public static Singleton1 getInstance(){//提供一个静态方法,获取这个实例
        if(instance == null) { //如果没有创建,否则,不执行
            synchronized (Singleton1.class) { //加上同步  Singleton1.class为线程锁
                if (instance == null) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    instance = new Singleton1();
                }
            }
        }
        return instance;
    }
}
  1. 枚举式:表示该类型的对象是有限的几个,我们可以限定为一个,就成了单例,枚举类型的构造器都是私有化的。
public enum  Sington2 {
   INSTANCE
}

4.静态内部类:在内部类被加载和初始化的时候,才创建对象,静态内部类不自动随着内部类的加载和初始化而初始化,它是单独去加载和初始化的(线程安全)

public class  Sington2 {

    //私有的构造方法
    private Sington2(){

    }
    //私有的静态内部类
    private static class Inner{
        private static final Sington2 INSTANCE = new Sington2();
    }

    public static Sington2 getInstance(){
        return Inner.INSTANCE;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值