Java设计模式之创建型-单例模式(UML类图+案例分析)

这篇具有很好参考价值的文章主要介绍了Java设计模式之创建型-单例模式(UML类图+案例分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基础概念

二、UML类图

三、角色设计

四、案例分析

4.1、饿汉模式

4.2、懒汉模式(线程不安全)

4.3、懒汉模式(线程安全)

4.4、双重检索模式

4.5、静态内部类

4.6、枚举 

五、总结


一、基础概念

单例模式确保一个类只有一个实例,提供一个全局访问点。一般实现方式是把构造函数设为私有,并提供一个静态方法获取实例对象。

二、UML类图

Java设计模式之创建型-单例模式(UML类图+案例分析),Java,设计模式,java,设计模式,单例模式

三、角色设计

角色 描述
单例 在单例类的内部实现只生成一个实例,同时它提供一个静态的 getInstance()方法,让外部以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个 Singleton类型的静态对象,作为外部共享的唯一实例。

四、案例分析

4.1、饿汉模式

直接在类内部创建一个静态final常量实例,线程安全,调用效率高,但无法延迟加载。

public class Singleton_Hungry {
    /**
     * 私有实例,静态变量会在类加载的时候初始化,是线程安全的
     */
    private static final Singleton_Hungry instance = new Singleton_Hungry();

    /**
     * 私有构造方法
     */
    private Singleton_Hungry() {
    }

    /**
     * 获取实例的方法
     */
    public static Singleton_Hungry getInstance() {
        return instance;
    }
}

4.2、懒汉模式(线程不安全)

起初没有实例,第一次调用才初始化,线程不安全,需加锁处理。

public class Singleton_Lazy {
    /**
     * 私有实例
     */
    private static Singleton_Lazy instance;

    /**
     * 私有构造方法
     */
    private Singleton_Lazy() {
    }

    /**
     * 获取实例的方法
     */
    public static Singleton_Lazy getInstance() {
        if (instance == null) {
            instance = new Singleton_Lazy();
        }
        return instance;
    }
}

4.3、懒汉模式(线程安全)

加锁处理,线程安全但影响效率,大部分情况下不需要同步。

public class Singleton_Lazy_Safe {

    /**
     * 私有实例
     */
    private static Singleton_Lazy_Safe instance;

    /**
     * 私有构造方法
     */
    private Singleton_Lazy_Safe () {
    }

    /**
     * 获取实例的方法,该方法使用synchronized加锁,来保证线程安全性
     */
    public static synchronized Singleton_Lazy_Safe getInstance() {
        if (instance == null) {
            instance = new Singleton_Lazy_Safe ();
        }
        return instance;
    }
}

4.4、双重检索模式

双重检查锁单例模式是在懒汉式单例模式的基础上,额外加锁保证多线程安全,同时保证效率,并且加入了第二次判断,避免多线程下创建多个实例。

public class Singleton_Lazy_Double {
    
    //用volatile关键字确保 instance 在多线程下的可见性
    private static volatile Singleton_Lazy_Double instance = null;

    //将构造方法私有化,禁止外部通过构造方法创建实例
    private Singleton_Lazy_Double() {}

    //提供一个公共的访问方法,用于获取该类的唯一实例
    public static Singleton_Lazy_Double getInstance() {
        //如果instance为空,就进行实例化
        if (instance == null) {
            //保证多线程下只有一个线程进行实例化
            synchronized (Singleton_Lazy_Double.class) {
                //第二次判断,避免多线程下创建多个实例
                if (instance == null) {
                    instance = new Singleton_Lazy_Double();
                }
            }
        }
        return instance;
    }

}

4.5、静态内部类

静态内部类单例模式是在类加载时会创建一个静态内部类,调用getInstance方法时才会去加载该内部类并初始化INSTANCE实例。该方式既保证了线程安全,也保证了懒加载和高效访问的特性。

public class SingletonStatic {

    /**
     * 私有构造方法
     */
    private SingletonStatic() {
    }

    /**
     * 取实例的方法
     */
    public static SingletonStatic getInstance() {
        return LazyHolder.INSTANCE;
    }

    /**
     * 私有静态内部类
     */
    private static class LazyHolder {
        private static final SingletonStatic INSTANCE = new SingletonStatic();
    }
}

4.6、枚举 

使用枚举实现单例模式可以节省大量代码,并且防止多线程安全以及反序列化及反射攻击的问题。

public enum SingletonEnum {

    INSTANCE;

    public void test() {
        System.out.println("hello");
    }

}

五、总结

优点:

1、在内存中只有一个实例,减少内存开销。避免对资源的多重占用。设置全局访问点,严格控制访问。

缺点:

1、不符合单一职责原则。扩展困难,如果要扩展需要修改源代码。攻击者可通过反射和反序列化的方式获取实例而破坏单例。

应用场景:

1、需要频繁实例化然后销毁的对象、创建对象时消耗资源过多的情况等。

2、单例模式应用在工具类、线程池、配置类、对话框、日志对象、缓存等场景中,在工具类中应用是最为典型的。

符合的设计原则:

1、单一职责原则(Single Responsibility Principle)

单例类只负责创建自己的一个实例,有且只有这一个职责。

2、开闭原则(Open Closed Principle)

单例类可以通过扩展改变内部实现逻辑,而不影响调用端。

3、里氏替换原则(Liskov Substitution Principle)

单例类一般会实现一个接口定义方法,任何扩展的实现会保持一致性。

4、依赖倒转原则(Dependency Inversion Principle)

调用端通过接口依赖单例,不依赖具体实现,降低了依赖度。

5、接口隔离原则(Interface Segregation Principle)

单例类只定义获取实例的接口,符合接口隔离原则。

枚举实现单例最大优点是实现简单,天生线程安全,防反射攻击,是首选方式。

总的来说,以上各种实现方式之间存在效率、线程安全、懒加载等方面的权衡和区别,应根据需要选用最合适的单例模式实现。文章来源地址https://www.toymoban.com/news/detail-546980.html

到了这里,关于Java设计模式之创建型-单例模式(UML类图+案例分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式之结构型-桥接模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、支付方式 4.2、支付渠道  五、总结 桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是“将抽象部分与实现部分分离,使它们都可以独立地变化”。 桥接模式的核心思想是把抽象(abstraction)与实现

    2024年02月13日
    浏览(43)
  • Java设计模式之行为型-责任链模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、在Java中实现 4.2、在SpringBoot中实现  五、总结  责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。请求会被链上每个处理者处理,直到请求被处理完毕。该模式主要解决的是请求的发送者和

    2024年02月15日
    浏览(38)
  • Java设计模式之行为型-迭代器模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 迭代器模式是一种常用的设计模式,它主要用于遍历集合对象,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 举个简单的比喻,聚合对象像一个存放苹果的篮子,迭代

    2024年02月16日
    浏览(42)
  • Java设计模式之结构型-组合模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、菜单遍历  五、总结  组合模式(Composite Pattern)又叫部分-整体模式,它通过将对象组合成树形结构来表示“整体-部分”的层次关系,允许用户统一单个对象和组合对象的处理逻辑。 角色 描述

    2024年02月16日
    浏览(50)
  • Java设计模式之结构型-享元模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、游戏角色 五、总结 享元模式是一种结构型设计模式,主要用于减少创建大量相似对象所占用的内存,它通过共享技术来有效支持大量细粒度的对象。 角色 描述 抽象享元角色 定义出对象的外部状

    2024年02月16日
    浏览(45)
  • Java设计模式之结构型-装饰器模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计 四、代码实现 案例一 案例二  五、总结  装饰器模式是指不必在改变原有的类和不使用继承的情况下,动态扩展一个对象的功能。 角色 描述 抽象构件 是一个接口或者抽象类,定义我们最核心的对象 具体构件 抽象构件的实现,

    2024年02月11日
    浏览(35)
  • Java设计模式之行为型-备忘录模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结  备忘录模式是一种行为型设计模式,它允许保存一个对象的内部状态到一个备忘录对象中,这样就可以在需要的时候恢复这个对象的状态了,同时又不违反封装性原则。 这个模式的核心就是备忘录对象,

    2024年02月16日
    浏览(37)
  • Java设计模式之行为型-访问者模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 访问者模式是一种对象行为型设计模式,它能够在不修改已有对象结构的前提下,为对象结构中的每个对象提供新的操作。 访问者模式的主要作用是把对元素对象的操作抽象出来封装到访问者类中,这样就

    2024年02月16日
    浏览(53)
  • Java设计模式之UML类图

    UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作。一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。对于程序员来说,最频繁使用的莫过于类图。因此,这里我只讲解UML类图。 类图是面向对象系统建模中最常

    2024年02月03日
    浏览(41)
  • Java设计模式之责任链模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设计模式之责任链模式 OA系统采购审批需求 传统方案解决OA系

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包