首页 > 其他分享 >设计模式 单例模式

设计模式 单例模式

时间:2024-08-19 08:54:57浏览次数:19  
标签:getInstance SingletonLazy 模式 SingletonHungry 线程 单例 static 设计模式

单例模式的定义

单例模式是指确保一个类在任何情况下都只有一个实例,并且提供一个访问该单例的全局访问点。

如何创建一个单例模式

构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例;
考虑对象创建时的线程安全问题;
考虑是否支持延迟加载;
考虑 getInstance() 的性能(是否加锁)

单例模式适用的场景

J2EE 标准中的 ServletContext 和 ServletContextConfig;
Spring 框架应用中的 ApplicationContext、数据库中的连接池等也都是单例模式。

饿汉式(饥渴型)单例模式

在类加载的时候就创建对象,不会出现线程安全问题(因为还没有开始加载的时候就创建好了对象,线程都没有机会去争夺)。

package SingletonFactoryModel;

public class SingletonHungry {
    //成员变量 在类加载的时候就把对象创建好了
    static SingletonHungry s = new SingletonHungry();
    // 1.构造方法私有化
    private SingletonHungry(){}
    // 返回就是私有类已经创建好的对象
    private static SingletonHungry getInstance(){
        return s;
    }

    public static void main(String[] args) {
        SingletonHungry instance = SingletonHungry.getInstance();
        SingletonHungry instance1 = SingletonHungry.getInstance();
        System.out.println(instance1 == instance);

    }
}

懒汉式(懒狗)单例模式

懒汉式:在需要的时候才创建,类加载时不创建对象, 直接创建对象可能会有线程安全问题,导致重复创建不同对象,通过施加 双重校验锁来实现对同一对象的获取

package SingletonFactoryModel;

public class SingletonLazy {
    // 通过 volatile  关键字保证 数据的原子性
    /*
        一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
        保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
        禁止进行指令重排序。
     */
    private  volatile static SingletonLazy singletonLazy;

    private SingletonLazy(){}

    public static SingletonLazy getInstance() {
        // 检查是否需要创建
        if (singletonLazy == null) {
            // synchronized 保证同一时刻只有一个对象去调用
            synchronized (SingletonLazy.class){
                // 因为前面施加了同步块 可能会导致 两个线程都校验为空重复创建对象,需要再次判断为空
                if(singletonLazy == null){
                    singletonLazy = new SingletonLazy();
                }
            }
        }
        return singletonLazy;
    }

    public static void main(String[] args) {
        SingletonLazy instance = SingletonLazy.getInstance();
        SingletonLazy instance1 = SingletonLazy.getInstance();
        System.out.println(instance == instance1);
    }
}

标签:getInstance,SingletonLazy,模式,SingletonHungry,线程,单例,static,设计模式
From: https://blog.csdn.net/ling_zhi_xin/article/details/141310511

相关文章

  • 设计模式 适配器模式
    适配器模式适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式的结构适配器模式通常涉及以下几个角色:目标(Target):定义客户端所期望的接口。适配者(Adaptee):定义一个已经存在......
  • 责任链模式
    责任链模式 责任链模式 双龙物流亦称: 职责链模式、命令链、CoR、ChainofCommand、ChainofResponsibility 意图责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。......
  • C++ 设计模式——建造者模式
    建造者模式建造者模式组成部分建造者模式使用步骤1.定义产品类2.创建具体产品类3.创建建造者接口4.实现具体建造者5.创建指挥者类6.客户端代码建造者模式UML图建造者模式UML图解析建造者模式的优缺点建造者模式的适用场景完整代码建造者模式建造者模式(B......
  • 工厂设计模式:深入解析与应用
    工厂设计模式:深入解析与应用在软件开发领域,设计模式是解决常见问题的最佳实践。工厂设计模式(FactoryDesignPattern)作为一种创建型设计模式,提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。本文将深入探讨工厂设计模式的定义、分类、实现方式、优缺点以及应用......
  • 【项目】多设计模式下的同步&&异步日志系统(二)
    继上文对日志系统的介绍,并且实现了日志等级、日志消息的定义、以及格式化消息等。由这三个模块就能完整的输出一条消息。但是考虑到日志消息不可能全部都通过显示器展示。本项目针对落地方式,也进行多种编写,以供使用。消息落地类(简单工厂模式)消息落地的方式标准输出文件按......
  • 【项目】多设计模式下的同步&&异步日志系统(三)
    继前俩次完成了日志系统的等级类、消息结构以及格式化消息,并且将格式化的数据实现落地。落地存在同步和异步的落地方式。同步:本线程生成消息,并且进行IO写。异步:线程生成消息,交给子线程写。为此实现了双缓冲区用来减少异步带来的频繁申请锁释放锁减低效率。本文继续实现异步......
  • AWS CLI 令人惊叹的自动提示模式
       欢迎来到雲闪世界。我一直觉得awscli使用起来很麻烦。很难记住命令和参数,而且输出内容笨拙且晦涩难懂。因此,您通常必须一遍又一遍地查阅文档,这非常繁琐。然而,最近我发现AWSCLI的一个内置功能改变了这一切:自动提示模式自动提示模式是AWSCLI的按需内置UI,您......
  • 设计模式六大原则之:开闭原则
    1.开闭原则简介开闭原则(OpenClosedPrinciple,OCP)‌是面向对象程序设计(OOP)中的一个基本原则,也是软件工程中的一项重要原则。它的核心思想是:一个软件实体(如类、模块或函数)应该对扩展开放,即当需求变化时,可以通过添加新的代码进行扩展来满足新的需求,而不需要修改现有的代码。......
  • UsbTreeView 查看USB端口模式(速率)
    USB版本和对应速度USB1.1USB2.0FullSpeed12MbpsUSB2.0USB2.0High-Speed480MbpsUSB3.0USB3.1Gen1USB3.2Gen15GbpsUSB3.1USB3.1Gen2USB3.2Gen210GbpsUSB3.2USB3.2Gen2x220GbUSB3.2Gen1和USB3.2Gen2拥有USBTYPE-A、USBTYPE-B......