Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式---单例模式

设计模式---单例模式

作者头像
大忽悠爱学习
发布于 2021-11-15 07:22:03
发布于 2021-11-15 07:22:03
23900
代码可运行
举报
文章被收录于专栏:c++与qt学习c++与qt学习
运行总次数:0
代码可运行

单例模式


单例模式的介绍


单例模式实现的八种方式


饿汉式

静态常量

步骤:

1.构造器私有化(防止new)

2.类的内部创建对象

3.向外暴露一个静态的公共方法—getInstance

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//饿汉式静态常量
class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private final static  Singleton  instance=new Singleton();
    //提供一个公有的静态方法,返回一个实例对象
    public static Singleton getInstance()
    {
     return instance;
    }
}

public class Main
{
    public static void main(String[] args)
    {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

静态常量的优缺点

静态代码块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//饿汉式静态常量
class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private static  Singleton  instance;
    //在静态代码块中,创建单例对象
    static
    {
     instance=new Singleton();
    }
    //提供一个公有的静态方法,返回一个实例对象
    public static Singleton getInstance()
    {
     return instance;
    }
}

public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

静态代码块的优缺点

懒汉式

线程不安全的写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private static  Singleton  instance;
    //提供一个公有的静态方法
    //当使用该方法时,才去创建实例对象
    //即懒汉式
    public static Singleton getInstance()
    {
        if(instance==null)
        {
            instance=new Singleton();
        }
     return instance;
    }
}

public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}
优缺点

线程安全,同步锁—效率低,不推荐

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private static  Singleton  instance;
    //提供一个公有的静态方法
    //当使用该方法时,才去创建实例对象
    //即懒汉式
    //给当前静态方法加上一个同步锁,这样所有的对象就是一把锁
    //多个对象同时调用此方法,会按顺序依次调用
    public static synchronized Singleton getInstance()
    {
        if(instance==null)
        {
            instance=new Singleton();
        }
     return instance;
    }
}

public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}
优缺点

线程安全,同步代码块—无法解决线程安全问题,不推荐

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private static  Singleton  instance;
    //提供一个公有的静态方法
    //当使用该方法时,才去创建实例对象
    //即懒汉式
    public static  Singleton getInstance()
    {
        if(instance==null)
        {
            //锁的是代码块
            //锁的对象是当前类的字节码文件对象,即当前类的所有势力对象拥有一把锁
            synchronized(Singleton.class)
            {
                instance=new Singleton();
            }
        }
     return instance;
    }
}

public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}
优缺点

双重检查—解决线程安全和懒加载问题–推荐使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    //volatile 保证变量在多线程下的可见性,即每个线程获取到当前变量的值是最新的值
    private static  volatile Singleton  instance;
    //提供一个公有的静态方法
    //当使用该方法时,才去创建实例对象
    public static  Singleton getInstance()
    {
        //加入双重检查问题,解决线程安全,同时解决懒加载问题
        if(instance==null)
        {
            //锁的是代码块
            //锁的对象是当前类的字节码文件对象,即当前类的所有势力对象拥有一把锁
            synchronized(Singleton.class)
            {
                if(instance==null)
                {
                    instance=new Singleton();
                }
            }
        }
     return instance;
    }
}

public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

优缺点


静态内部类—可以实现懒加载,线程安全,推荐使用

静态内部类在调用时,才会加载

当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
//静态内部类
    private static class SingletonInstance{
        //静态属性
        private static final Singleton INSTANCE=new Singleton();
}
    public static  Singleton getInstance()
    {
        //该方法调用时,静态内部类加载,里面的静态属性才会赋值
        return SingletonInstance.INSTANCE;
    }
}

public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

优缺点


枚举

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
enum Singleton
{
    //枚举常量
    INSTANCE;
    //底层: public static final Singleton INSTANCE= new Singleton ();
    //方法
    public void getInstance()
    {
        System.out.println("得到实例");
    }
}

public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.INSTANCE;
        Singleton s2=Singleton.INSTANCE;
        s1.getInstance();
        s2.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

优缺点


单例模式注意事项


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 设计模式(一)之单例模式 理论代码相结合
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)–来自百度百科
宁在春
2022/10/31
3270
Java 设计模式(一)之单例模式 理论代码相结合
图解Java设计模式之单例设计模式
1)设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)代码了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 2)设计模式的本质提高软件的维护性、通用性和扩展性,并降低软件的复杂度。 3)《设计模式》是经典的书,作者是Erich Gamma\Richard Helm\ Ralph Johnson和John Vlissides Design(俗称“四人组GOF”) 4)设计模式并不局限于某种语言,Java、PHP、C++都有设计模式。
海仔
2020/03/19
2700
图解Java设计模式之单例设计模式
设计模式--单例模式
1 饿汉式(静态变量) package com.shi.design.singleton; /** * 单例模式:1 饿汉式(静态变量) * @author shiye * */ public class Singleton1 { public static void main(String[] args) { Singleton singleton1 = Singleton.getInstance(); Singleton singleton2 = Singleton.getInst
用户5927264
2019/08/12
3670
设计模式--单例模式
【云+社区年度征文】设计模式-单例模式(五种实现方法详解)
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)。就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
唔仄lo咚锵
2020/11/27
4020
设计模式 (二)单例模式(提供代码,浅显易懂)
设计模式分为至种类型,共 23 种 ● 1)创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式 ● 2)结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 ● 3)行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)
一写代码就开心
2022/06/19
2750
一篇通俗易懂的文章让你彻底了解设计模式中的单例模式
之前给大家讲了关于设计模式的七大原则,这一次给大家带来了设计模式中的单例模式,以后会将23种设计模式一一为大家准备好。接下来让我们来看看单例模式吧。
@派大星
2023/06/28
2310
一篇通俗易懂的文章让你彻底了解设计模式中的单例模式
设计模式-单例模式
模式定义 确保一个类最多只有一个实例,并提供一个全局访问点。 单例模式分为饿汉式和懒汉式。 懒汉式单例模式:在类加载时不初始化。 饿汉式单例模式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。 饿汉式-线程安全 1 /** 2 * 饿汉式单例模式(线程安全) 3 */ 4 public class Singleton { 5 //static单例变量 6 private static Singleton singleton = new Singleton()
武培轩
2018/04/18
5720
Java设计模式之(一)------单例模式
IT可乐
2018/01/04
9090
Java设计模式之(一)------单例模式
单例设计模式(Singleton)附带案例代码仓库
使上面定义的单例类(Singleton)可以创建多个对象,枚举方式(因为枚举方式是基于JVM底层的一个实现,它已经把所有的问题解决掉了)除外。有两种方式,分别是序列化和反射。
叫我阿杰好了
2022/11/07
2620
单例设计模式(Singleton)附带案例代码仓库
java设计模式(2)-单例设计模式
上一篇推文写了工厂方法模式,包括简单工厂模式、多工厂模式、静态工厂模式、抽象工厂模式,这篇推文记录一下单例设计模式
爱敲代码的猫
2019/10/17
4000
史上最全讲解单例模式以及分析源码中的应用
1、单例模式介绍所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。比如Hibernate 的SessionFactory,它充当数据存储源的代理,并负责创建Session 对象。SessionFactory 并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory 就够,这是就会使用到单例模式。2、单例模式的种类饿汉式(静态常量)饿汉式(静态代码块)懒汉式(线程不安全)懒汉式(线程安全,同步
小熊学Java
2022/09/04
4140
单例模式的运用
单例模式:属于创建型模式,涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其**唯一的对象**的方式,可以**直接访问**,不需要实例化该类的对象。
忆愿
2024/08/01
1220
单例模式的运用
《23种设计模式(Java版)》| 单例模式(内附源码案例)。
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
百思不得小赵
2022/12/01
3110
《23种设计模式(Java版)》| 单例模式(内附源码案例)。
单例设计模式解读
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
一个风轻云淡
2023/10/15
2480
单例设计模式解读
设计模式
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法)。
星哥玩云
2022/09/14
4000
设计模式
详解设计模式:单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
栗筝i
2022/12/02
4170
设计模式实战-单例模式,我就是天下无双
大家都知道,一个对象的产生都是通过 new 关键字实现的(当然也存在其它方式,比如反射、复制等),new 的实现又是依托于构造函数的,默认一个类会自动生成一个无参的构造函数在不指定构造函数的情况下。构造函数一般都是 public 权限修饰的,想象一下,如果我们将类的构造函数的访问修饰符改为 private 不就可以禁止外部创建该对象了吗?这个时候外部想要实例化该类怎么办呢?
架构师修炼
2020/07/17
6720
面试官,你的单例模式能保证百分之百单例吗?
我的一个小伙伴也趁着这个机会面了几家试了试水,其中有面试官问到了一个问题:使用过单例模式吗?单例模式有哪些实现方式?你用过哪些?你的单例模式能保证百分之百单例吗?
编程大道
2020/05/12
7430
设计模式-单例模式
单例模式 什么是单例模式? 单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。 特点: 一个类只能有一个实例 自己创建这个实例 整个系统都要使用这个实例 什么时候用单例模式?
潇洒
2023/10/20
2470
单例模式的几种实现方式及对比
单例模式是设计模式中最简单也是最常用的模式之一,所谓单例就是在系统中只有一个该类的实例。
编程大道
2019/09/07
6870
推荐阅读
相关推荐
Java 设计模式(一)之单例模式 理论代码相结合
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档