设计模式--单例模式

news2024/10/2 20:23:22

介绍

 所谓类的单例模式 就是采取一定的方法保证在整个软件系统中对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)

 比如 Hibemate的SessionFactory 它充当数据存储源的代理 并负责创建Session对象 SessionFactory并不是轻量级的 一般情况下 一个 项目通常只需要一个SessionFactory就够 这样就需要用到单例模式了

单例模式的八种实现方式

饿汉式(静态常量)

public class HungryMan1 {
    //1 构造器私有话 外部不能直接new对象调用
    private HungryMan1(){}

    //2 本类内部创建对象实例
    private final static HungryMan1 instance = new HungryMan1();
    //3 提供一个公有的静态方法 返回实例对象
    public static HungryMan1 getInstance(){
        return instance;
    }
}
public class HungryManTest {
    public static void main(String[] args) {
        HungryMan1 instanbce = HungryMan1.getInstance();
        HungryMan1 instabce2 = HungryMan1.getInstance();
        System.out.println(instanbce == instabce2);
        System.out.println(instanbce.hashCode());
        System.out.println(instabce2.hashCode());
    }
}

测试结果

 

饿汉式(静态代码块)

public class HungryMan2 {
    private HungryMan2(){}

    //在静态代码块中 创建单例对象
    static {
        instance = new HungryMan2();
    }

    //2 本类内部创建对象实例
    private final static HungryMan2 instance;
    //3 提供一个公有的静态方法 返回实例对象
    public static HungryMan2 getInstance(){
        return instance;
    }
}

测试同 "饿汉式静态常量"一致

懒汉式(线程不安全)

public class LazyMan1 {
    private static LazyMan1 instance;

    private LazyMan1(){};

    //提供一个静态的公有方法 当使用到该方法时 才会去创建 instance
    public static LazyMan1 getInstance(){
        if(instance==null){
            instance = new LazyMan1();
        }
        //等价于 jdk8 Optional写法
//        Optional.ofNullable(instance).orElseGet(()->new LazyMan1());
        return instance;
    }
}

测试同 "饿汉式静态常量"一致

懒汉式(线程安全 同步方法)

public class LazyMan2 {
    private static LazyMan2 instance;

    private LazyMan2(){};

    //提供一个静态的公有方法 加入同步处理的代码 解决线程安全问题
    public static synchronized LazyMan2 getInstance(){
        if(instance==null){
            instance = new LazyMan2();
        }
        return instance;
    }
}

测试同 "饿汉式静态常量"一致

懒汉式(线程安全 同步代码块)

public class LazyMan3 {
    private static LazyMan3 instance;

    private LazyMan3(){};

    //提供一个静态的公有方法 加入同步处理的代码 解决线程安全问题
    public static LazyMan3 getInstance(){
        if(instance==null){
            synchronized(LazyMan3.class){
                instance = new LazyMan3();
            }
        }
        return instance;
    }
}

测试同 "饿汉式静态常量"一致

双重检查

public class LazyMan4 {
    private static volatile LazyMan4 instance;

    private LazyMan4(){};

    //提供一个静态的公有方法 加入双重检查代码 解决线程安全问题 同时解决懒加载问题
    public static synchronized LazyMan4 getInstance(){
        if(instance==null){
            synchronized(LazyMan4.class){
                if(instance==null){
                    instance = new LazyMan4();
                }
            }
        }
        return instance;
    }
}

测试同 "饿汉式静态常量"一致

静态内部类

public class LazyMan5 {
    private LazyMan5(){};

    //书写静态内部类 该类中有一个静态属性 LazyManInstance
    private static class LasyManInstance{
        private static final LazyMan5 INSTANCE = new LazyMan5();
    }

    //提供一个静态公有方法 直接返回LazyManInstance.INSTANCE
    public static synchronized LazyMan5 getInstance(){
        return LasyManInstance.INSTANCE;
    }
}

测试同 "饿汉式静态常量"一致

枚举

public class HungryManTest {
    public static void main(String[] args) {
        LazyMan6 in = LazyMan6.INSTANCE;
        LazyMan6 in2 = LazyMan6.INSTANCE;
        in.sayHello();
        System.out.println(in==in2);
    }
}
enum LazyMan6 {
    INSTANCE;
    public void sayHello(){
        System.out.println("hello world!");
    }
}

测试:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中的Map(三种双列集合万字详解)

点击可查看单列集合Set万字详解:其中还包含哈希解读和底层分析。 文章目录 前言一、Map1.Map集合常用的API代码演示:1.Map集合的基本功能2.Map集合的获取功能3.Map的getOrDefault()方法 2.Map集合的三种遍历1.键找值、值找键2.键值对3.Lambda表达式 二、…

【C++11】晦涩难懂语法系列:可变参数模板

目录 可变参数模板 1.1 概念 1.2 可变参数模板定义 1.3 参数包的展开方式 1.3.1 递归展开参数包 1.3.2 逗号表达式展开参数包 1.4 STL的emplace系列函数 可变参数模板 1.1 概念 在C语言阶段,我们已经接触过可变参数,比如scand、printf等等 这里…

9.2 回归分析

学习目标: 回归分析是一种广泛应用于数据分析和预测的统计方法,可以用来探索自变量与因变量之间的关系并进行预测。我学习回归分析,我会采取以下步骤: 学习基本概念:回归分析中的基本概念包括自变量和因变量、回归系数…

运放专题:运放输入端交直流混合信号隔直放大

运放输入不隔直放大 运放输入端不隔直,那么经过运放放大后,交流成分放大了,直流成分也被放大了。看下面的仿真: 交流信号为:振幅3V, 频率5K的正弦波,直流偏置为1V 可以看到,交流信号被放大的…

【Linux】匿名管道代码实现-mypipe

文章目录 管道介绍什么是管道:管道的原理管道的特点 具体代码详写创建初始文件makefile编写定义任务列表-task.hpp分阶段代码编写总代码展示: ctrlProcess.cc 编写头文件包含(如有不会,自己查谷歌)定义全局变量以解耦main,函数框架EndPoint定义creatProcess 创建管道…

Apollo配置中心使用篇

Apollo配置中心使用篇 常见配置中心对比Apollo核心概念Apollo核心特性Apollo架构设计各模块介绍服务端设计客户端设计Apollo与Spring集成的底层原理 Apollo安装安装apollo-portalconfig service和admin service部署多网卡问题解决修改Portal环境配置调整ApolloPortal配置 Apoll…

【产品设计】用户操作日志

日志记录了代码的执行过程,根据目的不同,可以分为系统日志和操作日志。 一、什么是日志 日志记录了代码的执行过程。根据目的不同,可分为系统日志和操作日志。 1)系统日志 记录系统中硬件、软件和系统问题的信息,同…

C#基础学习--枚举器和迭代器

目录 枚举器和可枚举类型 IEnumerator 接口 IEnumerable 接口 实现 IEnumerable 和 IEnumerator的示例 泛型枚举接口 迭代器 迭代器块 使用迭代器来创建枚举器 使用迭代器来创建可枚举类型 常见迭代器模式 产生多个可枚举类型 将迭代器作为属性 迭代器实质 枚举器和可…

【分享】比ChatGPT还厉害?可以自主解决复杂任务的Auto-GPT迅速走红(内含体验地址)

哈喽,大家好,我是木易巷~ 最近木易巷在了解Auto GPT,今天给大家分享一下~ 自主解决复杂任务的Auto-GPT 什么是Auto-GPT? Auto-GPT 是一款开源 Python 应用程序,由开发者用户 Significant Gravitas 于 2023 年 3 月 30…

钉钉接入“通义千问”大模型,输入斜杠“/”唤起智能服务

4月18日,钉钉总裁叶军在2023春季钉峰会上宣布,钉钉正式接入阿里巴巴“通义千问”大模型,输入“/”在钉钉即可唤起 10 余项 AI 能力,叶军现场演示了群聊、文档、视频会议及应用开发四个场景。 现场展示中,只…

C++:智能指针(auto_ptr/unique_ptr/shared_ptr/weak_ptr)

为什么需要智能指针&#xff1f; C没有垃圾回收机制。 #include<iostream> using namespace std;int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; }void Func() {// 1、如果p1这里new 抛异常会如何…

网络原理数据链路层

嘿嘿,又见面了,今天为大家带来数据链路层的相关知识.这个层面的知识离咱们程序员太遥远了,我们简单介绍一下就行 1.以太网 2.认识Mac地址 3.区分Mac地址和IP地址 4.MTU 5.DNS 1.以太网 以太网是数据链路层和物理层的使用的网络,物理层用的不咋多,我们就先不讲了,直接看数…

论文阅读 - Segment Anything

文章目录 0 前言1 预备知识1.1 深度学习训练框架1.2 语义分割训练框架 2 SAM的任务3 SAM的模型3.1 模型整体结构3.2 Image encoder3.3 Prompt encoder3.4 Mask decoder3.5 训练细节 4 SAM的数据4.1 模型辅助的手动标注阶段4.2 半自动阶段4.3 全自动阶段 5 SAM的应用5.1 拿来主义…

什么是感知机——图文并茂,由浅入深

什么是感知机——图文并茂&#xff0c;由浅入深 文章目录 什么是感知机——图文并茂&#xff0c;由浅入深引言感知机的引入宝宝版青年版老夫聊发少年狂版激活函数 感知机的应用与门或门 感知机与深度学习感知机与神经网络感知机和深度学习什么关系呢&#xff1f; 引言 生活中常…

【4月比赛合集】19场可报名的「创新应用」和「程序设计」大奖赛,任君挑选!

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 更多比赛信息见 CompHub主页 或 点击文末阅读原文 以下信息仅供参考&#xff0c;以比赛官网为准 目录 创新应用赛&…

【SpringBoot】一:SpringBoot的基础(上)

文章目录 1. 脚手架创建项目1.1使用Spring Initializr1.2 IDEA中使用脚手架创建项目 2. 代码结构2.1 单一结构2.2 多模块2.3 包和主类2.4 pom文件2.4.1 父项目2.4.2 启动器2.4.3 不使用父项目 3. 运行SpringBoot项目 1. 脚手架创建项目 脚手架辅助创建程序的工具&#xff0c;S…

《Java8实战》第12章 新的日期和时间 API

原来的Java的时间类Date、java.util.Calendar类都不太好&#xff0c;以语言无关方式格式化和解析日期或时间的 DateFormat 方法也有线程安全的问题 12.1 LocalDate、LocalTime、LocalDateTime、Instant、Duration 以及 Period 12.1.1 使用 LocalDate 和 LocalTime LocalDate…

Maven的概述

Maven是干什么用的 maven提供了一套标准的项目结构&#xff0c;这样可以让不同编译器所写的代码在任何一个编译器上都可以运行。 maven提供了一套标准化的构建流程 编译&#xff0c;测试&#xff0c;打包&#xff0c;发布->maven提供了简单的命令可以完成这些操作&#xf…

1秒解决notion客户端所有问题-历史上最简单

1 前言 你是否安装了enhancer后&#xff0c;notion打不开&#xff0c;一直报错&#xff1f;你是否为实现notion客户端汉化和大纲的各种操作而各种苦恼&#xff1f;你是否不习惯使用网页的开始&#xff0c;很想有一个客户端的notion&#xff01; 全部解决&#xff01; 2 网页…

如何理解线程池

线程池的核心状态 核心状态说明 在线程池的核心类ThreadPoolExecutor中&#xff0c;定义了几个线程池在运行过程中的核心状态&#xff0c;源码如下&#xff1a; private static final int COUNT_BITS Integer.SIZE - 3;private static final int CAPACITY (1 << CO…