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


相关推荐

  • mysql分页的limit参数「建议收藏」

    Mysql的分页的两个参数select*fromuserlimit1,21表示从第几条数据开始查(默认索引是0,如果写1,从第二条开始查)2,表示这页显示几条数据

    2022年4月15日
    48
  • c#封装动态库_nginx调用so动态库

    c#封装动态库_nginx调用so动态库一直对动态库的封装理解不是很透彻,虽然之前写过一个Demo,不过并没有真正的理解。所以写下来,帮助自己理解下。1、一个程序从源文件编译生成可执行文件的步骤:预编译–> 编译–> 汇编–>链接(1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开、处理条件编译指令、处理#include指令等。(2)编译过程就是把预处理完的文件进行一系列词法

    2022年9月30日
    0
  • 微商分销代理商城源码带代理等级和升级条件 thinkphp框架「建议收藏」

    微商分销代理商城源码带代理等级和升级条件 thinkphp框架「建议收藏」  介绍:微商分销代理商城源码基于think框架开发是一款微商分销代理商城源码,可以自己设置代理等级和升级条件(如购买指定商品、消费额度)网站搭建方式介绍:测试环境php7.0+mysql5.6数据库配置文件applicationdatabase.php后台/admin用户:admin密码:123456下载链接:thinkphp框架微商分销代理商城源码-代理等级和升级条件…

    2022年5月17日
    44
  • jpg和jpeg的区别是什么_jpeg和jpg的区别是什么

    jpg和jpeg的区别是什么_jpeg和jpg的区别是什么jpg与jpeg的区别在哪

    2022年8月1日
    3
  • javascript 换行符[通俗易懂]

    javascript 换行符[通俗易懂] 在JS的字符串里对[TAB]的表述是 /x09  你可以做这样的测试: alert(“/x41”); //看看得到是什么?? 是字母A(41是十六进制的ASCII码值)  我喜欢用 /x0f 这类的做分隔符, [TAB]键用户还是有可能输入的, 但 /x0f 就绝对不可能输入  var s = “A/x0fB/x0fC/x0f

    2022年5月10日
    41
  • html 简单的table样式

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

    2022年7月3日
    23

发表回复

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

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