首页 > 其他分享 >单例模式

单例模式

时间:2022-11-22 19:14:35浏览次数:48  
标签:instance 模式 Antts static private 单例 public 加载

单例模式指的是:此类在任何时候都只存在一个对象:

实现步骤:1、构造器私有化。2、提供获取对象的方法getInstance()。

分类:

    饿汉式:在加载类的时候就创建对象。

    懒汉式:在使用类的时候才创建对象。

    枚举,是 JDK 1.5 中引入的新特性。


 

实现方式:

1、饿汉式:在加载类的时候,便创建对象。

/**
 *饿汉式实现单例模式:加载类的时候创建好对象。不能延时加载
 */
public class Antts{
    //1、类加载的时候线程一定安全
    private static Antts instance = new Antts();

    //2、构造器私有化
    private Antts(){
        if(null!=instance) {
            throw new RuntimeException();//避免通过反射调用构造器
        }
    }
    //3、对外提供获取对象的方法
    public static Antts getInstance() {
        return instance;
    }
    //4、避免通过反序列化获取新对象
    public Object readResolve() throws ObjectStreamException{
        return instance;
    }
}
示例代码

2、懒汉式:在使用的时候,创建对象(延时加载),需要给getInstance方法加锁,慢。

/**
 *懒汉式实现单例模式:要使用对象的时候创建对象(延时加载),需要加锁。
 */
public class Antts{
    //1、类加载的时候线程一定安全
    private static Antts instance;

    //2、构造器私有化
    private Antts(){
        if(null!=instance) {
            throw new RuntimeException();//你干嘛?想通过反射创建新对象?
        }
    }
    //3、对外提供获取对象的方法,为了保证多线程下不出意外,需要加锁。
    public static synchronized Antts getInstance() {
        if(instance==null){
            instance = new Antts();//使用的时候创建对象
        }
        return instance;
    }
    //4、避免通过反序列化获取新对象
    public Object readResolve() throws ObjectStreamException{
        return instance;
    }
}
示例代码

 

3、懒汉式,但是使用静态内部类创建对象:不需要使用锁,快。

/**
 * 静态内部类实现单例:类加载的时候不会加载内部类
 */
public class Antts{
    //1、为了保证不被反射和反序列化创建多个对象,储存一下
    private static Antts instance;

    //静态内部类
    private static class Temp{
        private static final Antts antts = new Antts();
    }

    //2、构造器私有化
    private Antts(){
        if(null!=instance) {
            throw new RuntimeException();//你干嘛?想通过反射创建新对象?
        }
    }
    //3、此时才会加载内部类
    public static  Antts getInstance() {
        if(instance==null){
            instance=Temp.antts;
        }
        return instance;
    }
    //4、避免通过反序列化获取新对象
    public Object readResolve() throws ObjectStreamException{
        return instance;
    }
}
查看示例

4、懒汉式,但是使用双重检测加锁:使用了synchronized块,volatile声明,保证对象唯一。

class Antts{
    //volatile避免指令重排导致  创建多个对象
    private static volatile Antts instance;

    //构造器私有化
    private  Antts(){ 
        if(instance!=null){
            throw new RuntimeException();//你干嘛?
        }
    }
    //提供公共的静态方法获取对象
    public static Antts getInstance(){
        //双重检测,提高性能。
        if(null!=instance){
            return instance;
        }
        synchronized (Antts.class) {
            if (instance == null) {
                //创建一个对象:1、开辟空间。2、初始化对象信息。3、返回对象地址给引用。
                instance = new Antts();
            }
            return instance;
        }
    }
}
实现代码

4、枚举实现:在加载的时候就创建了,不能延时加载。

/**
 * 使用枚举实现单例:这里的Antts.INSTANCE用于只有一个。
 */
public enum  Antts{
    INSTANCE;
    void doSomething(){
        System.out.println("I love her!");
    }
}
class test{
    public static void main(String[] args) {
        Antts.INSTANCE.doSomething();
    }
}

运行结果:

 

标签:instance,模式,Antts,static,private,单例,public,加载
From: https://www.cnblogs.com/lurenjia-bky/p/16916133.html

相关文章

  • webpack - 开发模式
    1.设置webpack为开发模式设置模式(mode:development/production)设置sourcemaps(devtool:'inline-source-map')constpath=require('path');constHtmlWebpa......
  • 推特群控营销:自动发帖模式
    说到群控,大家一点也不陌生,今天推特群推王给大家介绍一下twitter群控,现在很多企业都在通过推特做推广,简单来说,Twitter群控营销就是借助第三方群控软件控制多个账号,同时大批量......
  • 设计模式 - (抽象)工厂模式
    本文以故事方式介绍工厂模式以及抽象工厂模式的一些知识,本文出现的人名为化名周末闲来无事,小可爱给大漂亮说想吃烤红薯,让大漂亮做给小可爱吃,大漂亮有点为难了,一个堂堂七尺......
  • 设计模式之单例设计模式
    1.1基本概念在某些特殊场合中,⼀个类对外提供且只提供⼀个对象时,这样的类叫做单例类,⽽设计单例类的流程和思想叫做单例设计模式。1.2实现流程私有化构造方法,使用pr......
  • 大咖说·先临三维|技术入云塑造3D视觉行业新模式
    高精度3D视觉技术主要的工作原理是什么?它的开发难度在哪里?数字化技术对其有何助力?本期大咖说,看先临三维副总裁兼研究院副院长江腾飞如何分享。嘉宾介绍江腾飞:先......
  • 虚拟机打不开,提示“此主机不支持虚拟化实际模式”的解决方法。
    文章目录​​1、安装/启动虚拟机失败​​​​2、获取视频教程​​​​3、版权声明​​1、安装/启动虚拟机失败在VMWare软件中,安装/启动虚拟机时,如果出以类似以下的错误提示:......
  • Template Method设计模式
    TemplateMethod动机(Motivation)在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而......
  • Observer设计模式
    Observer/Event动机(Motivation)在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。......
  • Decorator设计模式
    Decorator动机(Motivation)在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能......
  • Strategy设计模式
    程序的复用性是二进制层面的复用,而不是代码的复制粘贴Strategy动机(Motivation)在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使......