返回顶部
首页 > 资讯 > 后端开发 > Python >Java 设计模式以虹猫蓝兔的故事讲解单例模式
  • 706
分享到

Java 设计模式以虹猫蓝兔的故事讲解单例模式

2024-04-02 19:04:59 706人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录专栏介绍本期介绍什么是单例模式懒汉式一正常模式单例模式为什么线程不安全呢懒汉式二为什么线程安全呢饿汉式懒汉式与饿汉式的区别专栏介绍 【JAVA长虹键法】 主要讲了23种设计模式,

专栏介绍

【JAVA长虹键法】 主要讲了23种设计模式,本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助!

本期介绍

模式: 单例模式

案例: 虹猫蓝兔造剑

什么是单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

单例模式大致分为懒汉式和饿汉式,接下来用案例分析

懒汉式一

是否 Lazy 初始化: 是

是否多线程安全:否

实现难度: 易

描述: 这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加 synchronized,所以严格意义上它并不算单例模式。

这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。

概念看不懂没关系,接下来举例。

案例一:

创建一个剑类,这个类可以实例化一把剑。

虹猫和蓝兔两个人都想要造一把剑,虹猫先打造了一把剑,命名为长虹剑,然后蓝兔也打造了一把剑,但是没有命名。

现在来分析两个情况,一个情况是正常模式,另一种情况是单例模式。

正常模式

剑类:


public class Jians {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试类:


public class Demo1 {
    public static void main(String[] args) {
         //虹猫的剑
        Jians hong = new Jians();
         //蓝兔的剑
        Jians lan = new Jians();
        hong.setName("长虹剑");
        System.out.println(hong.getName());
        System.out.println(lan.getName());
    }
}

结果:

在正常模式下,我new了虹猫和蓝兔的剑。其实就是两把剑,两个不同的对象。

单例模式

剑类:

剑类中的getInstance()方法有一个造剑的功能,也就是new一个剑对象的功能。


 public class Jian {
    private static Jian jian;
    private String name;

    public static Jian getInstance() {
        if (jian == null) {
            jian = new Jian();
        }
        return jian;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试类:


public class Demo {
    public static void main(String[] args) {
        //虹猫的剑
        Jian hong = Jian.getInstance();
        //蓝兔的剑
        Jian lan = Jian.getInstance();
        //虹猫把剑命名长虹剑
        hong.setName("长虹剑");
        //输出
        System.out.println(hong.getName());
        System.out.println(lan.getName());
    }
}

结果:

在单例模式下,我new了虹猫和蓝兔的剑。其实就是一把剑,一个相同的对象。

为什么线程不安全呢

单例模式下的剑类:


 public class Jian {
    private static Jian jian;
    private String name;

    public static Jian getInstance() {
        if (jian == null) {
            jian = new Jian();
        }
        return jian;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

就拿这个类来说,他是线程不安全的。因为他通过getInstance()方法来获取对象。如果是多线程运行,有线程1和线程2都先后进入了这个方法,因为线程1刚进入方法还没有返回对象,线程2就进入了方法。所以线程2也会new一个对象,因为此时线程2进入方法的时候jian还是null的。

懒汉式二

是否 Lazy 初始化: 是

是否多线程安全: 是

实现难度: 易

描述: 这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。

优点: 第一次调用才初始化,避免内存浪费。

缺点: 必须加锁 synchronized 才能保证单例,但加锁会影响效率。

为什么线程安全呢

这里还用上面那个案例,这次主要介绍懒汉式一和懒汉式二的区别。

懒汉式一和懒汉式二的主要区别在剑类上。

懒汉式一的剑类:


 public class Jian {
    private static Jian jian;
    private String name;

    public static Jian getInstance() {
        if (jian == null) {
            jian = new Jian();
        }
        return jian;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

懒汉式二的剑类:


 public class Jian {
    private static Jian jian;
    private String name;

    public static synchronized Jian getInstance() {
        if (jian == null) {
            jian = new Jian();
        }
        return jian;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

在getInstance()方法前加了个字段synchronized,synchronized是一把锁,作用是同一时间只能有一个线程进入这个方法,这样就避免了懒汉式一中两个线程都进入方法的情况出现,就不会new两个对象,所以线程安全。

饿汉式

是否 Lazy 初始化: 否

是否多线程安全: 是

实现难度: 易

描述: 这种方式比较常用,但容易产生垃圾对象。

优点: 没有加锁,执行效率会提高。

缺点: 类加载时就初始化,浪费内存。

饿汉式就是直接在类中new一个对象,就是不管你需不需要剑我已经把剑造好了。

饿汉式剑类:


public class Jian {
    private static Jian jian=new Jian();
    private String name;

    public static synchronized Jian getInstance() {
        return jian;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试类:


public class Demo {
    public static void main(String[] args) {
        //虹猫的剑
        Jian hong = Jian.getInstance();
        //蓝兔的剑
        Jian lan = Jian.getInstance();
        //虹猫把剑命名长虹剑
        hong.setName("长虹剑");
        //输出
        System.out.println(hong.getName());
        System.out.println(lan.getName());
    }
}

饿汉式中剑类的getInstance()方法已经失去了造剑的功能,测试类调用它只是返回一把提前造好的剑

懒汉式与饿汉式的区别

还是这个案例,虹猫和蓝兔都想造一把剑,懒汉式是有一个剑类,剑类中有一个造剑的方法,调用这个方法的时候打造一把剑。饿汉式也有一个剑类,不同的是这个剑类直接就把剑造好了,没有造剑的方法,不管你虹猫和蓝兔想不想造剑,剑都已经造好了。

优点: 没有加锁,执行效率会提高。

缺点: 类加载时就初始化,浪费内存。

现在在看饿汉式的优缺点就容易理解了。

下期预告

模式: 简单工厂模式

案例: 虹猫蓝兔莎莉找铸剑师造剑

到此这篇关于Java 设计模式以虹猫蓝兔的故事讲解单例模式的文章就介绍到这了,更多相关Java 单例模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 设计模式以虹猫蓝兔的故事讲解单例模式

本文链接: https://lsjlt.com/news/144197.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 设计模式以虹猫蓝兔的故事讲解单例模式
    目录专栏介绍本期介绍什么是单例模式懒汉式一正常模式单例模式为什么线程不安全呢懒汉式二为什么线程安全呢饿汉式懒汉式与饿汉式的区别专栏介绍 【JAVA长虹键法】 主要讲了23种设计模式,...
    99+
    2024-04-02
  • Java 设计模式以虹猫蓝兔的故事讲解原型模式
    目录什么是原型模式优点缺点应用场景浅克隆代码实现总结深克隆代码实现总结什么是原型模式 原型(Prototype)模式的定义如下: 用一个已经创建的实例作为原型,通过复制该原型对象来创...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解桥接模式
    目录什么是桥接模式优点缺点知识点桥接模式实现颜色黄色红色裙子长裙短裙测试总结模式: 桥接模式 案例: 蓝兔宫主买裙子 什么是桥接模式 桥接(Bridge)模式的定义如下: 将抽象与实...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解代理模式
    目录什么是代理模式优点缺点知识点代理模式实现卖酒干娘的酒馆大奔的酒摊测试总结模式: 代理模式 案例: 大奔代干娘卖酒 什么是代理模式 代理模式的定义: 由于某些原因需要给某对象提供一...
    99+
    2024-04-02
  • Java 设计模式以虹猫蓝兔的故事讲解简单工厂模式
    目录专栏介绍本期介绍什么是简单工厂模式优点缺点应用场景简单工厂的实现专栏介绍 本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助! 本期介绍 模式:...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解建造者模式
    目录什么是建造者模式优点缺点知识点建造者模式实现丹药抽象丹方九转仙丹丹方太虚化神丹丹方神医豆豆测试总结什么是建造者模式 建造者(Builder)模式的定义: 指将一个复杂对象的构造与...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解装饰器模式
    目录什么是装饰器模式优点缺点知识点装饰器模式实现七侠虹猫加料加盐加孜然测试总结模式: 装饰器模式 案例: 黑小虎抓住了七侠,把虹猫烤了 什么是装饰器模式 装饰器(Decorator)...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解适配器模式
    目录什么是适配器模式优点缺点知识点适配器模式实现类适配器长虹剑气火舞旋风剑气火晶石测试对象适配器长虹剑气火舞旋风剑气火晶石测试总结模式: 适配器模式 案例: 虹猫利用火晶石催发火舞旋...
    99+
    2024-04-02
  • Java设计模式-单例模式
    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供...
    99+
    2023-06-05
  • Java超详细讲解设计模式之一的单例模式
    目录单例模式1.单例模式的结构2.单例模式的实现2.1饿汉式2.2懒汉式3.单例模式的破坏3.1序列化和反序列化3.2反射单例模式 单例模式顾名思义就是单一的实例,涉及到一个单一的类...
    99+
    2024-04-02
  • Golang设计模式之单例模式详细讲解
    目录单例模式概念示例单例模式 单例是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 单例拥有与全局变量相同的优缺点。 尽管它们非常有用, 但...
    99+
    2023-01-11
    Go单例模式 Go设计模式
  • Java设计模式之单件模式深入讲解
    目录定义Java单件模式经典单件模式的实现多线程单件模式的实现急切创建实例双重检查加锁Python单件模式模块实现new关键字实现装饰器实现函数装饰器类装饰器定义 单件模式确保一个类...
    99+
    2024-04-02
  • JAVA设计模式之单例模式详解
    目录前言一、单例模式是什么?二、懒汉式单例三、饿汉式单例四、双重校验锁总结前言 在之前的文章里已经介绍了设计模式以及设计原则的概念,接下来我们从单例模式入手深入学习几种常用的JAVA...
    99+
    2024-04-02
  • java设计模式之单例模式解析
    单例模式是最简单但同时也是很重要的一种设计模式,优点有以下几个方面:当内存占用特别大的类需要频繁地创建销毁时,单例模式可以节省内存和提高性能,例如myBatis里面的sessionFactory当需要对文件做单一读写时,例如同一时间只能同时...
    99+
    2023-05-31
    java 设计模式 单例模式
  • Java设计模式之单例模式
    目录什么是设计模式?单例模式是什么?单例模式设计的原则是什么?Java实现单例模式的5种方式?懒汉饿汉静态内部类双重校验锁DCL(Double Check Lock)枚举(num)总...
    99+
    2024-04-02
  • Java设计模式之单例模式示例详解
    目录0.概述1.饿汉式1.1 饿汉式单例实现1.2 破坏单例的几种情况1.3 预防单例的破坏2.枚举饿汉式2.1 枚举单例实现2.2 破坏单例3.懒汉式4.双检锁懒汉式5.内部类懒汉...
    99+
    2024-04-02
  • 如何理解Java设计模式的单例模式
    这篇文章主要讲解了“如何理解Java设计模式的单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的单例模式”吧!一、什么是单例模式单例模式是一种常用的软件设计模式...
    99+
    2023-06-25
  • C++单例设计模式详细讲解
    目录特殊类设计只能在堆上创建对象的类请设计一个类只能在栈上创建对象请设计一个类不能被拷贝请设计一个类不能被继承请设计一个类只能创建一个对象(单例模式)懒汉模式和饿汉模式的对比特殊类设...
    99+
    2024-04-02
  • Java设计模式中的原型模式讲解
    目录介绍原型模式深拷贝与浅拷贝原型模式代码总结介绍 原型模式 在Java中,原型模式是一种创建型设计模式,它允许通过复制一个现有对象来创建一个新对象,而不是通过创建新的对象来初始化一...
    99+
    2023-05-18
    Java 原型设计模式 Java 设计模式 Java 原型模式
  • Java设计模式的单例模式实例分析
    本文小编为大家详细介绍“Java设计模式的单例模式实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式的单例模式实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是单例模式单例模式(S...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作