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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm 2021.5.4 激活码【在线注册码/序列号/破解码】

    pycharm 2021.5.4 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    45
  • WriteProcessMemory_writeandimprove

    WriteProcessMemory_writeandimproveWriteProcessMemory有好几个参数其中的nSize怎么设置??比如Short型Integer型?  nSize以字节为单位,一个字节Byte等于8位基本数据类型的长度ShortInt8位=1ByteSmallInt16位=2ByteInteger16位=2ByteLongInt32位=4ByteWord16位=2ByteLon

    2025年11月8日
    3
  • kettle工具练习

    kettle工具练习一.抽取CSV文件csv.extract.csv中的数据保存至数据库extract中的数据表csv中。1.打开kettle工具创建一个转换csv_extract,并添加“CSV文件输入”控件,“表输出”控件及Hop跳连接线,用于实现CSV文件数据的抽取功能,具体效果如下图所示:2.配置CSV文件输入控件,具体操作如下图所示:获取字段…

    2022年10月17日
    1
  • hibernate中executeUpdate的缓存问题

    hibernate中executeUpdate的缓存问题解决hibernate批量更新时的缓存问题

    2022年10月20日
    3
  • 记录一次maven JVM 调优

    记录一次maven JVM 调优记录一次mavenJVM调优前言记录一次无(摸)聊(鱼)的GC调优过程,本着学以致用、务实求真的精神,看了《深入理解Java虚拟机》中作者对自己的开发ideeclipse工具做了JVM调优,觉得很有意思。感觉这个确实是可以用自己的知识来提升开发效率,所以就有了这次的玄学调优之旅,文中如果有错误,希望能够指出,非常感谢。优化背景我本人目前有个工作上的项目,编译的时间大概需要30多秒,这次的目标就是从JVM的层面折腾、优化编译速度,那么就开始吧编译时间基准线优化前的编译时间,先

    2022年5月14日
    48
  • flowable流程详解

    flowable流程详解flowable图例解释请假流程bpmn20.xml文件请假流程示例图例解释开始事件:图中用细线圆圈来表示,是流程实例的开始点箭头:表示节点之间的流转指向。用户任务:在图中用左上角有人的圆角矩形表示,这些是需要用户来操作的节点。图中有两个,第一个表示需要经理进行审批来同意或拒绝,第二个表示用户来确认销假。排它网关:用叉形符号填充的菱形表示,从该图中出来的箭头往往有多个,但只有一个满足条件,流程会沿着满足条件的方向流转。自动化任务:左上角有齿轮形状的的圆角矩形,表示自动执行的节点。图中

    2022年5月11日
    316

发表回复

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

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