Java单例模式以及其实现

Java单例模式以及其实现单例模式单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。简单来说就是类只能创建唯一一个对象实现要求:(1)构造器私有化:指用private修饰构造器,使得外部无法调用构造器,使得类外部方法无法创建该类对象(2)自行创建对象,静态

大家好,又见面了,我是你们的朋友全栈君。

单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

简单来说就是类只能创建唯一一个对象

实现要求:

(1)构造器私有化:指用private 修饰构造器,使得外部无法调用构造器,使得类外部方法无法创建该类对象
(2)自行创建对象,静态变量保存 :
(3)向外提供这个实例
(4)强调这是个单例,可用final表示

实现方法分为:饿汉式,懒汉式

饿汉式:初始化类时直接创建对象

实现方法主要有三种:

1、直接用静态字段保存,使得初始化类时就创建对象 ,最简单

public class Singleton {
    public static final  Singleton INSTANCE = new Singleton();
    private Singleton(){} //构造器私有化
}

2、通过枚举实现,设置唯一一个枚举,最简洁

public enum Singleton {
    INSTANCE
}

3、通过静态字段实现,可以在静态字段中实现复杂操作

public class Singleton {
    public static final  Singleton INSTANCE;
    static {
         INSTANCE = new Singleton();
    }
    private Singleton(){};
}

懒汉式:要使用时才创建对象

实现方法也有三种

1、通过get方法获得唯一对象,最简单的懒汉式,不过不适合单线程

public class Singleton {
    private static Singleton INSTANCE;
    private Singleton(){}
    private static Singleton getINSTANCE(){
        if(INSTANCE == null){
            INSTANCE = new Singleton();
        }
        return INSTANCE;
    }
}

2、相对于上面相比添加了一个多线程监视器,称为双检锁/双重校验锁

public class Singleton {
    private static Singleton INSTANCE;
    private Singleton(){}
    private static Singleton getINSTANCE() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {//加一个多线程监视器
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}

3、因为类初始化不会初始化静态内部类,它是要单独去加载和初始化的,从而实现线程安全,所以可用内部类实现线程互异(登记式)

public class Singleton {
    private Singleton(){}
    private static class Inner{
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance(){return Inner.INSTANCE;}
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156871.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 删除表中重复数据「建议收藏」

    删除表中重复数据「建议收藏」删除表中重复数据

    2022年4月24日
    35
  • 【数据增强】Cutout「建议收藏」

    【数据增强】Cutout「建议收藏」论文:ImprovedRegularizationofConvolutionalNeuralNetworkswithCutout.Github:https://github.com/uoguelph-mlrg/Cutout.Cutout的出发点和随机擦除一样,也是模拟遮挡,目的是提高泛化能力,实现上比RandomErasing简单,随机选择一个固定大小的正方形区域,然后采用全0填充就OK了,当然为了避免填充0值对训练的影响,应该要对数据进行中心归一化操作,norm到0。(如果你还不了

    2022年9月25日
    2
  • Bootstrap 时间控件 datetimepicker

    Bootstrap 时间控件 datetimepickerBootstrap的时间控件易用且美观,下面将用法记录一下,大家有需要可以直接看官网的介绍,还是很基础的。网址:http://www.bootcss.com/p/bootstrap-datetimepicker/Bootstrap有两种时间控件:datepicker和datetimepicker,后者是前者的拓展,增加了到时分秒的选择。下面是选用了datetimepicker的…

    2022年5月10日
    45
  • 银河麒麟v10.1_银河麒麟v10系统

    银河麒麟v10.1_银河麒麟v10系统银河麒麟v10下载(服务器版桌面版)-2022-03-16更新银河麒麟桌面操作系统V10和银河麒麟高级服务器操作系统V10,分别推出了飞腾、鲲鹏、龙芯、申威、海光、兆芯六个版本银河麒麟高级服务器操作系统V10银河麒麟桌面操作系统V10…

    2022年10月16日
    5
  • Django(4)操作指令大全[通俗易懂]

    Django(4)操作指令大全[通俗易懂]前言我们掌握了如何在命令提示符或PyCharm下创建Django项目和项目应用,无论是创建项目还是创建项目应用,都需要输入相关的指令才能得以实现,这些都是Django内置的操作指令。在PyChar

    2022年8月7日
    7
  • html 简单的table样式

    html 简单的table样式效果预览:代码:素材图片:cell-blue.jpgcell-greyjpg

    2022年7月3日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号