static应用知识:单例设计模式

news2025/1/24 22:41:15

1、什么是设计模式(Design pattern)

开发中经常遇到一些问题,一个问题通常有n种解法的,但其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。
设计模式有20多种,对应20多种软件开发中会遇到的问题。
学设计模式主要学2点:
第一:这种模式用来解决什么问题;
第二:遇到这种问题了,该模式是怎么写的,他是如何解决这个问题的。

2、单例模式是什么?

  • 可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象。
  • 使用场景:例如电脑的任务管理器对象,我们只需要一个就可以解决问题了,这样可以节省内存空间。

3、单例的实现方式

饿汉单例模式;
懒汉单例模式;

(1) 饿汉单例设计模式
在使用类获取对象的时候,对象已经提前为你创建好了。

设计步骤:

第一,定义一个单例类;
第二,单例必须将构造器私有化,将构造器藏起来,防止对外产生对象;
第三,定义一个静态变量存储一个对象即可:属于类,与类一起加载一次。
 

//1.定义一个单例类
public class SingleInstance {
//    2.单例必须将构造器进行私有化,防止对外产生对象
    private SingleInstance() {

    }
//    3.饿汉单例是在获取对象前,已经提前准备好一个对象;这个对象只能是一个,所有定义静态变量存储
    public static SingleInstance instance = new SingleInstance();
}
/**
 单例测试类
 目标:理解饿汉单例的设计步骤
 */
public class SingleInstanceTest {
    public static void main(String[] args) {
        SingleInstance s1 = SingleInstance.instance;    //获取对象
        SingleInstance s2 = SingleInstance.instance;
        System.out.println(s1 == s2);
    }
}

控制台输出结果:

 饿汉单例重点总结

1、饿汉单例的实现步骤?

  • 定义一个类,把构造器私有化(防止对外产生对象)
  • 定义一个变量存储一个对象(调用类时,对象已经准备好了,与类一起加载一次)

(2) 懒汉单例设计模式

  • 在真正需要该对象的时候,才去创建一个对象(延迟加载对象)。

  • 设计步骤:

    • 第一,定义一个类,把构造器私有化:防止对外产生对象;
    • 第二,定义一个静态变量存储一个对象即可:属于类,与类一起加载一次;
    • 第三,必须提供一个方法返回一个单例对象-
//1.定义一个懒汉单例类
public class SingleInstance02 {
//    2.必须将构造器私有化:防止对外产生对象
    private SingleInstance02(){

    }
//    3.定义静态变量存储一个对象;与类一起加载,只加载一次。最好做到私有化,这样可以避免给别人挖坑,公开化别人只会拿到一个null。
    private static SingleInstance02 instance02;
//    4.提供一个方法,获取一个单例对象 再return返回单例对象
    public static SingleInstance02 getInstance02(){
        if (instance02 == null){
            instance02 = new SingleInstance02();
        }
        return instance02;
    }
}
public class SingleInstanceTest02 {
    public static void main(String[] args) {
//        获取对象
        SingleInstance02 s1 = SingleInstance02.getInstance02();
        SingleInstance02 s2 = SingleInstance02.getInstance02();

        System.out.println(s1 == s2);

    }
}

控制台输出结果:

 

懒汉单例重点总结

1、懒汉单例的实现步骤?

  • 定义一个单例类,把构造器私有化(防止对外产生对象)
  • 定义一个私有化的静态变量,用于存储一个对象,不设初始值
  • 提供一个返回单例对象的方法

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

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

相关文章

轻松上手 | 使用国内资源安装 K3s 全攻略

作者: 王海龙,SUSE Rancher 中国社区技术经理,Linux Foundation APAC Evangelist,负责 Rancher 中国技术社区的维护和运营。拥有 8 年的云计算领域经验,经历了 OpenStack 到 Kubernetes 的技术变革,无论底层…

3D帧间匹配-----剔除动态障碍物

0. 简介 作为SLAMer在建图时最怕的就是大量的动态障碍物存在,这会导致建图的不精确,而本文主要围绕着如何剔除动态障碍物开始讲起,并提供一种快速的过滤障碍物的方法。 1. 主要方法 在调研的过程中主要存在有两种方法,第一种如…

安全标准汇总

文章目录资源导航法律法规0x01常见标准代号0x02 2022年新发布0x03 按体系分类一般性法律规定规范和惩罚信息网络犯罪的法律直接针对信息安全的特别规定具体规范信息安全技术、信息安全管理0x04 安全等级保护0x05 数据安全声明资源导航 国家标准全文公开系统:国家标…

代码随想录训练营第35天|LeetCode 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

参考 代码随想录 题目一:LeetCode 860.柠檬水找零 这个题在做的时候有误解,第一不能对数组bills排序,只能按照给定的顺序处理;第二,只能从头开始处理,不能中间的某个点开始。 其实这个题很简单&#xff…

synchronized锁升级过程

【一些面试真题】: 阿里P9——0x80的执行过程。 【 重温CAS过程 】: 【硬件】: Lock指令在执行后面指令的时候锁定一个北桥信号(不采用锁总线的方式)。 【用户态 与 内核态】: 作为操作系统来说&#x…

WebRTC学习笔记二 基础概念

一、WebRTC与架构 简单来说,WebRTC 是一个可以在 Web 应用程序中实现音频,视频和数据的实时通信的开源项目。在实时通信中,音视频的采集和处理是一个很复杂的过程。比如音视频流的编解码、降噪和回声消除等,但是在 WebRTC 中&…

C. Strange Test(位运算或)

Problem - 1632C - Codeforces 伊戈尔正在读11年级。明天他将不得不写一份信息学测试&#xff0c;由学校最严格的老师帕维尔-杰尼索维奇负责。 伊戈尔知道测试将如何进行&#xff1a;首先&#xff0c;老师会给每个学生两个正整数a和b&#xff08;a<b&#xff09;。之后&…

[2022-11-28]神经网络与深度学习 hw10 - LSTM和GRU

contentshw10 - LSTM 和GRU相关习题task 1题目内容题目分析题目解答题目总结task 2题目内容题目分析题目解答题目总结task 3题目内容题目分析题目解答题目总结task 4题目内容题目分析题目解答问题总结hw10 - LSTM 和GRU相关习题 task 1 题目内容 当使用公式htht−1g(xt,ht−…

Linux系统中利用C语言控制LED的方法

大家好&#xff0c; 今天主要和大家聊一聊&#xff0c;如何利用C语言控制LED灯的实验。 目录 ​第一&#xff1a;C语言板控制LED灯简介 第二&#xff1a;实验程序实现 ​第三&#xff1a;C语言实验控制程序 ​第一&#xff1a;C语言板控制LED灯简介 实际工作中很少会使用到汇…

分离变数法

今天是2022年11月28号 我的方程学的不太好&#xff0c;一些讲宇宙的&#xff0c;讲技术的&#xff0c;方程实在是看不懂很多方程的解与参数不可分割期末来了 有的人回去了有的人要看光学了我呢&#xff0c;已经废物了&#xff0c;节日快乐&#xff0c;大家伙节日快乐啊&#xf…

Spirng 痛苦源码学习(二)——手写spring大致总框架(一)

文章目录前言一、总体步骤如下1、spring 文件夹2、myProject 文件夹二、主要coding1、配置文件2、容器3、一些spring中的重要的注解4、项目中的使用5.重要的bean定义信息6、postProcessor重要&#xff0c;前置通知和后置主要项目的截图前言 本文主要基于spring的注解的方式完成…

Spring相关源码解读

框架1.ApplicationContext refresh的流程2.spring bean 的生命周期3.spring事务失效的几种场景以及原因4.springMVC执行流程5.一些注解&#xff08;1&#xff09;Configuration&#xff08;2&#xff09;Import&#xff08;3&#xff09;SpringBootApplication6.spring中有哪些…

BP神经网络详解,Python实现求解异或问题

BP神经网络 符号及其含义 nln_lnl​表示第lll层神经元的个数&#xff1b;f(⋅)f()f(⋅)表示神经元的激活函数&#xff1b;W(l)∈Rni∗ni−1W^{(l)}\in\mathbb R^{n_i*n_{i-1}}W(l)∈Rni​∗ni−1​表示第l−1l-1l−1层到第lll层的权重矩阵&#xff1b;wij(l)w_{ij}^{(l)}wij(l…

基于tensorflow的ResNet50V2网络识别动物

前言 之前很多人在&#xff0c;如何进行XXX的识别&#xff0c;对应的神经网络如何搭建。对应神经网络怎么搭建&#xff0c;我也是照本宣科&#xff0c;只能说看得懂而已&#xff0c;没有对这块进行深入的研究&#xff0c;但是现在tensorflow&#xff0c;paddle这些工具&#x…

长期稳定的项目—steam搬砖

大家好&#xff0c;我是阿阳 steam搬砖项目一直稳稳定定的进行着&#xff0c;有些朋友基本都观察了近2年 所以很多人问我公众号的项目是不能做了吗&#xff1f;怎么最近做新的去了&#xff1f;很明显这是几乎不可能的事情&#xff0c;steam做2年了&#xff0c;本公众号都能翻到…

这几个数据分析项目,让我看到了什么才叫专业!!

大家好&#xff0c;我是小一 新的一周又来了&#xff0c;从今天开始&#xff0c;会出一个新的系列《数分实验室》 实验室会介绍一些有内核、有科技的数据分析实战项目。 项目数据集、源代码都是公开的&#xff0c;非常适合想练手但是又没数据、没参考案例的同学 今天先热热…

ES的基础概念

1、ES是什么 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单&#xff0c;它不仅包括了全文搜索功能&#xff0c;还可以进行以下工作:分布式实时文件存储&am…

6-1分支限界法

6-1分支限界法 1.分支限界法与回溯法的不同 &#xff08;1&#xff09;求解目标: 回溯法的求解目标是找出解空间树中满足约束条件的所有解&#xff08;或一个最优解&#xff09;&#xff0c; 而分支限界法的求解目标则是找出满足约束条件的一个解&#xff08;或最优解&#x…

组织机器学习代码

组织机器学习代码 从note本转移到 Python 脚本时组织代码。 Intuition 有组织的代码就是有可读的、可重现的、健壮的代码。您的团队、经理&#xff0c;最重要的是&#xff0c;您未来的自己&#xff0c;将感谢您为组织工作付出的最初努力。在本课中&#xff0c;将讨论如何将代码…

pytest测试框架入门1

pytest单元测试框架 单元测试是指在软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试 单元测试框架主要做什么 测试发现&#xff1a;从多个文件里面找到我们的测试用例测试执行&#xff1a;按照一定的顺序和规则…