【JAVA学习笔记】38 - 单例设计模式-静态方法和属性的经典使用

news2024/9/27 5:41:17

项目代码

https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/final_

一、什么是设计模式

1.静态方法和属性的经典使用

2.设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索

二、什么是单例模式

单例(单个的实例)
1.所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某
个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
2.单例模式有两种方式: 1) 饿汉式2)懒汉式

                

三、单例模式应用实例

演示 饿汉式和懒汉式单例模式的实现

步骤如下:

1.饿汉式 在类加载的时候就就创建对象了 所以可以造成创建了对象但是没有使用 资源的浪费
1)构造器私有化(防止直接new)
2)类的内部创建静态对象
3)向外暴露一个静态的公共方法。getInstance
4)代码实现

public class SingleTon01 {
    public static void main(String[] args) {
        // GirlFriend xiaohuang = new GirlFriend("xiaohuang");
        // GirlFriend xiangwang = new GirlFriend("xiangwang");
        //通过方法就可以获取对象
        GirlFriend instance = GirlFriend.getInstance();
        System.out.println(instance);
        GirlFriend instance1 = GirlFriend.getInstance();
        System.out.println(instance1);
        System.out.println(instance == instance1);

    }
}
class GirlFriend{
    private String name;

    //为了能够在静态方法中使用,需要static修饰
    private static GirlFriend gf = new GirlFriend("hong");//2
    //如何保障只能创建一个GirlFriend对象?
    //1.私有化构造器
    //2.在类的内部创建静态对象
    //3.提供一个公共的静态static方法 返回gf对象
    private GirlFriend(String name) {//1
        this.name = name;
    }
    public static GirlFriend getInstance(){//3
        return gf;
    }
}

2.懒汉式 在类被使用的时候才创建对象

1)仍然构造器私有化

2)定义一个static静态属性对象

3)提供一个public的static方法,可以返回一个Cat对象

public class SingleTon02 {
    public static void main(String[] args) {
        System.out.println(Cat.n1);//此时使用n1并没有创建cat对象
        Cat instance = Cat.getInstance();//创建对象
        Cat instance1 = Cat.getInstance();//因为对象不为空,所以只会创建一次
        System.out.println(instance == instance1);
    }
}
class Cat{
    private String name;
    public static int n1 = 100;
    private static Cat cat;
    //1)仍然构造器私有化
    // 2)定义一个static静态属性对象
    // 3)提供一个public的static方法,可以返回一个Cat对象
    private Cat(String name){
        System.out.println("构造器被调用");
        this.name = name;
    }
    public static Cat getInstance(){
        if(cat == null){//如果还没有创建cat对象
            cat = new Cat("xiaohua");
        }
        return cat;
    }
}

四、饿汉式和懒汉式的区别

1.二者的主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时创建

2.饿汉式不存在线程安全问题,懒汉式存在线程安全问题(后面学习线程后,会完善一把)

                

3.饿汉式存在浪费资源的可能,因为如果一个实例对象都没使用,那么饿汉式创建的对象就浪费了;但懒汉式是使用时才创建就不存在这个问题

4.在我们javaSE标准类中,java.lang.runtime就是经典的单例模式

public class Runtime {
    private static Runtime currentRuntime = new Runtime();

    /**
     * Returns the runtime object associated with the current Java application.
     * Most of the methods of class <code>Runtime</code> are instance
     * methods and must be invoked with respect to the current runtime object.
     *
     * @return  the <code>Runtime</code> object associated with the current
     *          Java application.
     */
    public static Runtime getRuntime() {
        return currentRuntime;
    }

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

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

相关文章

【完美世界】被骂国漫之耻,石昊人设战力全崩,现在真成恋爱世界了

【侵权联系删除】【文/郑尔巴金】 深度爆料&#xff0c;《完美世界》动漫第135集预告片已经更新了&#xff0c;但是网友们对此却是一脸槽点。从预告中可以看出&#xff0c;石昊在和战王战天歌的大战中被打成重伤&#xff0c;最后云曦也被战天歌抓住。在云曦面临生死危机的时候…

AIGC底层数据探索——高质量数据助力大模型迭代升级

// 编者按&#xff1a;近年来&#xff0c;大模型的概念逐渐受到更广泛的关注&#xff0c;而谈及大模型就离不开对底层数据的探索。 大模型训练数据痛点与中文数据集现状&#xff1b;高质量数据定义&#xff1b;对话式数据模型实验&#xff1b;晴数智慧高质量数据解决方案。 文…

信号补零对信号频谱的影响

文章目录 前言一、 什么是补零二、案例三、补零前仿真及分析1、补零前 MATLAB 源码2、仿真及结果分析①、 x n x_n xn​ 时域图②、 x n x_n xn​ 频谱图 四、补零后仿真及分析1、补6000个零且1000采样点①、 MATLAB 源码②、仿真及结果分析 2、波形分辨率3、补6000个零且7000采…

电子巡更和智能巡检关系

电子巡更和智能巡检是两种重要的安全巡查技术&#xff0c;它们之间相似相通。 电子巡更是一种基于传统巡更系统发展而来的技术&#xff0c;主要通过数字化手段对巡查工作进行记录和监督。它通常由巡更棒、信息钮和电子巡更软件组成。巡查人员在进行巡查时&#xff0c;需要携带…

Kafka集群搭建与SpringBoot项目集成

本篇文章的目的是帮助Kafka初学者快速搭建一个Kafka集群&#xff0c;以及怎么在SpringBoot项目中使用Kafka。 kafka集群环境包地址&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;x9yn 一、Kafka集群搭建 1、准备环境 &#xff08;1&#xff09;准备三台…

泵站机电设备健康状态系统建立的关键

在现代工业运营中&#xff0c;泵站机电设备的健康管理至关重要。通过建立一套完善的泵站机电设备健康管理系统&#xff0c;可以有效地监测、诊断和维护设备&#xff0c;确保其正常运行和延长使用寿命。本文将从三个方面展开讨论&#xff0c;分别是泵站机电设备养护在设备健康管…

题目 1053: 二级C语言-平均值计算(python详解)——练气三层初期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

不懂项目管理三角,你的项目很难成功

在管理项目时&#xff0c;难免会出现影响项目的变更或其他问题。为了防止项目超出计划或超支&#xff0c;项目经理总是要平衡项目管理三角形&#xff08;由三个主要项目约束组成&#xff09;。 什么是项目管理三角形&#xff1f; 项目管理三角形由决定项目质量的三个约束组成…

LAMP项目部署实战

一、LAMP环境部署 1、回顾LAMP LAMP Linux Apache MySQL PHP Apache&#xff1a;主要用于接收用户的请求&#xff0c;处理业务逻辑&#xff0c;返回结果给客户端&#xff08;浏览器&#xff09; PHP&#xff1a;编程语言的一种&#xff0c;主要应用于Web开发。主要实现注…

python输出与数据类型

目标 1、使用print输出内容 2、熟悉字符串类型 3、熟悉数字类型 4、熟悉数字与字符串操作 输出 print可控制输出内容也可配合、-、*、/进行运算&#xff0c;和整数型配合可进行运算和字符型配合有不同效果&#xff0c;如为拼接&#xff0c;*为多次输出注&#xff1a;整数型如&…

【ROS入门】机器人系统仿真——URDF集成Gazebo

文章结构 URDF与Gazebo基本集成流程创建功能包编写URDF或Xacro文件启动 Gazebo 并显示机器人模型 URDF集成Gazebo相关设置collisioninertial颜色设置 URDF集成Gazebo实操编写封装惯性矩阵算法的 xacro 文件复制相关 xacro 文件&#xff0c;并设置 collision inertial 以及 colo…

嵌入式中的MCU、ARM、DSP、FPGA

目录 “角色扮演” MCU ARM 特点 DSP 特点 FPGA 特点 应用 “角色扮演” MCU&#xff08;Microcontroller Unit&#xff09;、ARM&#xff08;Advanced RISC Machine&#xff09;、DSP&#xff08;Digital Signal Processor&#xff09;和FPGA&#xff08;Field-Progr…

【Java 进阶篇】Java Servlet 执行原理详解

Java Servlet 是用于构建动态Web应用程序的关键组件之一。它允许开发者编写Java类来处理HTTP请求和生成HTTP响应&#xff0c;从而实现灵活、交互性强的Web应用。本篇博客将深入探讨Java Servlet的执行原理&#xff0c;适用于初学者&#xff0c;无需太多的先验知识。 什么是 Ja…

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四)

这篇博客是之前文章&#xff1a; Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;一&#xff09;Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;二&a…

解决Linux下编译Intel oneTBB动态库出错的问题

在CMakeLists.txt中&#xff0c;原来有一段这样查找和链接的配置代码 find_library(tbblibaray ${tbb_path}) target_link_libraries(backalarm ${tbblibaray})编译后提示错误&#xff1a; /myapp/library/tbb/libtbb.so&#xff1a;对‘__cxa_throw_bad_array_new_lengthCX…

MATLAB源码-第55期】matlab代码基于m序列的多用户跳频通信系统仿真,输出各节点波形图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1.跳频扩频调制 跳频扩频调制通过伪随机地改变发送载波频率&#xff0c;用跳变的频率来调制基带信号&#xff0c;得到载波频率不断变化的射频信号。 通常&#xff0c;跳频系统的频率合成器输出什么频率的载波信号是受跳频指…

harrypotter1-aragog靶机攻略

harrypotter1 扫描 nmap 指纹 目录 渗透 找到了登录位置 看到wordpress就用wpscan扫一扫 wpscan --url"http://10.4.7.153/blog" -e p --plugins-detection aggressive --api-tokend1fuMZc2tbhJWYk9VfNsl0GZlyYxkfH6bpL0pCKFhok扫描出有这些file manager漏洞 使用…

remount of the / superblock failed: Permission denied remount failed

雷电模拟器 挂载/system未读写总是失败 F:\Program\leidian\LDPlayer9>adb remount remount of the / superblock failed: Permission denied remount failed设置配置system.vmdk可写入 F:\Program\leidian\LDPlayer9>adb remount remount succeeded参考: https://www.…

排序-表排序

当我们需要对一个很大的结构体进行排序时&#xff0c;因为正常的排序需要大量的交换&#xff0c;这就会造成时间复杂度的浪费 因此&#xff0c;我们引入指针&#xff0c;通过指针临时变量的方式来避免时间复杂度的浪费 间接排序-排序思路&#xff1a;通过开辟一个指针数组&…

CRD2 值得一读的知识蒸馏与对比学习结合的paper 小陈读paper

一定要读 真的是不一样的收获啊 不知道 屏幕前的各位get到了没有 Hinton et al. (2015) introduced the idea of temperature in the softmax outputs to better represent smaller probabilities in the output of a single sample. Hinton等人(2015)引入了softmax输出中温…