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


相关推荐

  • VB.NET 用循环判断文本框是否为空

    VB.NET 用循环判断文本框是否为空VB.NET 用循环判断文本框是否为空

    2022年4月24日
  • python 进制转换[通俗易懂]

    python 进制转换[通俗易懂]文章目录前言一、Python提供的进制转换方法1.二进制转十进制2.八进制转十进制3.十六进制转十进制4.十进制转十六进制5.十进制转二进制6.十进制转八进制二、自定义进制转换1.转十进制2.十进制转七进制总结前言十进制是我们常用的数字形式,但机器使用的却是二进制,八进制,十六进制之类的,所以进制转换是基础要求,很多编程语言提供的有进制转换的方法,下面我们开始学习一、Python提供的进制转换方法1.二进制转十进制s=’1001’print(int(s,2))结果如下:in..

    2022年5月12日
  • vs tfs使用_win10安装vs2010不兼容

    vs tfs使用_win10安装vs2010不兼容一直是用vss的,最近突然看到,原来已经流行用vsts了(版本管理等服务用tfs)。太落伍了。故决定自己在个人电脑上安装vsts。首先在MSDN上看到,tfs2008以前要装在service系统上面,我没有,也不想去装。后来看到tfs2010几乎支持所有windows系统。故决定用现有的vs2008+tfs2010搭配。            ok,vs2008已有,打补丁sp1,下

    2022年9月23日
  • 郑州java工程师待遇怎么样_Java工程师工资待遇怎么样?

    郑州java工程师待遇怎么样_Java工程师工资待遇怎么样?Java工程师的工资待遇怎么样?一般情况下的JAVA软件工程师是分四个等级,从软件技术员到助理软件工程师,再到软件工程师,最后成为高级软件工程师。通常来说,具有3—5年开发经验的工程师,拥有年薪20万元是很正常的一个薪酬水平。80%的学生毕业后年薪都超过了10万元。Java工程师的工资待遇怎么样?首先java基本功需要具备,比如对一些简单的多线程,以及对常见的java框架有一定的修改,或者定制功能…

    2022年9月23日
  • Anti SQL Inject

    Anti SQL Inject

    2021年7月31日
  • VM虚拟机桥接模式无法联网解决办法

    VM虚拟机桥接模式无法联网解决办法1.背景介绍:桥接模式—-使虚拟机客户机可以和主机在同一网段,这样,和主机同局域网内的其他主机就也可以ping到虚拟机了;因此,虚拟机设置为桥接模式,且设为静态IP,这样以后就可以方便的使用虚拟机了;2.问题描述:桥接模式之前是好用的,但是主机有一天突然宕机了,重启之后,打开虚拟机,发现主机和虚拟机客户机相互之间ping不通;测试:a.将虚拟机IP获取方式改为自

    2022年5月6日

发表回复

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

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