Java复习-25-单例设计模式

news2024/11/18 17:31:48

单例设计模式

目的(使用场景)

在实际开发下,会存在一种情况:某一种类在程序的整个生命周期中,只需要实例化一次就足够了。例如,系统数据类,由于操作系统只有一个,因此在程序初始化时该类只需要实例化一次,之后的系统数据更改都是在这一个实例化对象中进行就可以。
在这里插入图片描述

功能

主要是一种控制实例化对象产生个数的设计操作。

方法

  1. 禁止主程序类中通过 new 实例化对象
    正常来说,定义了类之后,如果在主程序类之中利用 new 进行实例化的话,其个数是无法进行限制的。
class Singleton {
    public void print() {
        System.out .println("Hello,World")
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        Singleton instanceA = new Singleton();
        Singleton instanceB = new Singleton();
        Singleton instanceC = new Singleton();
        instanceA.print();
        instanceB.print();
        instanceC.print();
    }
}

那么首先就应该禁止单例类在主程序类中的实例化,我们知道,在主程序中的实例化是通过调用构造方法来实现的。而所有的类又默认提供的无参构造,因此首先应在类定义中,私有化构造方法
private Singleton() {} // 构造方法私有化
这样,我们在若依然主程序类中使用 new 来实例化对象时,就会报错

错误: Singleton() 可以在 Singleton 中访问 private
instance = new Singleton();

  1. 实例化放在单例类中进行
    无法在外部类中直接使用 new 进行实例化后,实例化过程只能放在自身类中进行,因此可以定义一个私有化成员属性,即声明一个单例类引用。
    private Singleton instance;
    但外部类依然要有途径来进行访问,因此可以使用 static 属性进行标注,
    private static Singleton instance;
    又要求控制其数量只能有一个,因此使用 final 定义
    private static final Singleton INSTANCE = new Singleton();

该引用的赋值放在一个方法中,该方法也要定义为类方法:

public static Singleton getInstance() {
    return INSTANCE;
}

两种单例设计模式

饿汉式

在系统加载类的时候就会自动提供有 Singleton 类的实例化对象。
方法示例中所实现的就是饿汉式

class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {} // 构造方法私有化
    public static Singleton getInstance() {
        return INSTANCE;
}
    public void print() {
        System.out .println("Hello,World")
    }

}
public class JavaDemo {

    public static void main(String args[]) {
        Singleton instance = null; // 仍可声明对象
        instance = Singleton.getInstance();
        instance.print();
    }
}

懒汉式

在第一次使用的时候才进行实例化对象处理.
这样在定义时就不能使用 final 来限制个数了,而是在获取实例方法中增加判断来限制个数。

class Singleton {
    private static  Singleton instance;
    private Singleton() {} // 构造方法私有化
    public static Singleton getInstance() {
        if (instance == null){ // 第一次使用
            instance = new Singleton() ; // 实例化对象
        }
        return instance;
}
    public void print() {
        System.out .println("Hello,World")
    }

}
public class JavaDemo {
    public static void main(String args[]) {
        Singleton instance = null; // 仍可声明对象
        instance = Singleton.getInstance();
        instance.print();
    }
}

面试题:编写一个Singleton程序,并说明其主要特点?

  • 代码如上,可以把懒汉式(后面需要考虑到线程同步问题) 和饿汉式都写上;
  • 特点:构造方法私有化,类内部提供 static 方法获取实例化对象,这样不管外部如何操作永远都只有一个实例化对象提供。

多例设计模式

多例设计指的是可以保留有多个实例化对象,例如:如果现在要定义一个描述性别的类,那么该对象只有两个:男、 女。或者描述颜色基色的类,可以使用: 红色、绿色、蓝色。这种情况下可以利用多例设计来解决。

class Color { // 定义描述颜色的类
    private static final Color RED = new Color("红色");
    private static final Color GREEN = new Color("绿色");
    private static final Color BLUE = new Color("蓝色");

    private String title;
    private Color(String title) { // 构造方法私有化
        this.title = title;
    }
    public static Color getInstance(String color){
        switch(color){
            case "red": return RED;
            case "green": return GREEN;
            case "blue" : return BLUE;
            default : return null;
        }
    }
    public String toString(){
        return this.title;
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        Color c = Color.getInstance("green");
        System.out.println(c);
    }
}

多例设计与单例设计的本质是相同的,一定都会在内部提供有 static 方法以返回实例化对象。

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

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

相关文章

【PMO项目管理】深入了解项目管理 | Stakeholder 利益相关者 | 利益相关者之间的立场差异

💭 写在前面:本文将带您深入了解项目管理的核心概念和关键要素。我们将从项目管理的基本理解开始,逐步探讨其领域、复杂性和变化的重点,以及项目管理的具体过程。我们还将研究项目的性质以及成功项目所必备的条件。在此过程中&…

PandaGPT部署演示

PandaGPT 是一种通用的指令跟踪模型,可以看到和听到。实验表明,PandaGPT 可以执行复杂的任务,例如生成详细的图像描述、编写受视频启发的故事以及回答有关音频的问题。更有趣的是,PandaGPT 可以同时接受多模态输入并自然地组合它们…

ClickHouse 存算分离改造:小红书自研云原生数据仓库实践

ClickHouse 作为业界性能最强大的 OLAP 系统,在小红书内部被广泛应用于广告、社区、直播和电商等多个业务领域。然而,原生 ClickHouse 的 MPP 架构在运维成本、弹性扩展和故障恢复方面存在较大局限性。为应对挑战,小红书数据流团队基于开源 C…

C++提高篇:深入理解纯虚函数和抽象类

在C中,纯虚函数和抽象类是面向对象编程中重要的概念。本文将会深入探讨这两个概念的含义、如何定义和使用它们,以及它们在实际开发中的应用。 一、什么是纯虚函数? 在C中,纯虚函数是指在基类中声明但没有实现的虚函数。纯虚函数的…

算法通关村第十七关:青铜挑战-贪心其实很简单

青铜挑战-贪心其实很简单 1. 难以解释的贪心算法 贪心学习法则:直接做题,不考虑贪不贪心 贪心(贪婪)算法 是指在问题尽心求解时,在每一步选择中都采取最好或者最优(最有利)的选择,从而希望能够导致结果最…

zabbix -- 安装

Zabbix zabbix除了可以监控linux服务器之外,还可以监控路由器、交换机、容器等,全方位监控 Zabbix对服务器的监控是通过在服务器上部署“间谍”程序zabbix-agent获取数据,但对于路由器、交换机等机器的监控不能进行部署,这个时候…

空气净化器上亚马逊美国站需要办理什么认证?空气净化器UL867测试报告如何办理?

空气净化器又称“空气清洁器”、空气清新机、净化器,是指能够吸附、分解或转化各种空气污染物(一般包括PM2.5、粉尘、花粉、异味、甲醛之类的装修污染、细菌、过敏原等),有效提高空气清洁度的产品,主要分为家用 、商用…

高忆管理:六连板捷荣技术或难扛“华为概念股”大旗

在本钱商场上名不见经传的捷荣技术(002855.SZ)正扛起“华为概念股”大旗。 9月6日,捷荣技术已拿下第六个连续涨停板,短短七个生意日,股价累积涨幅逾越90%。公司已连发两份股票生意异动公告。 是炒作,还是…

智能感测型静电消除器通常具备哪些特点

智能感测型静电消除器是一种利用高压电源产生的离子来中和空气中的静电,从而达到消除静电的目的的设备。它通过内置的感测装置来监测环境中的静电水平,并根据实时数据自动调节工作状态,以确保静电消除效果更好。 智能感测型静电消除器通常具…

Turf.js介绍

目录 1,使用场景2,安装 Turf.js3,在 Vue 3 组件中使用 Turf.js4,主要功能4.1,点、线、面的创建4.2,缓冲区计算(Buffer Analysis)4.3,点与线的相交判断4.4,多边…

MATLAB创建avi文件

简介 MATLAB可以对音频和视频文件进行处理,这里简单说明一下MATLAB创建avi文件的用法。 常用函数 aviinfo 测试用用例,如下所示 用于avi格式的音频视频文件,返回一个对该文件的描述,只能用于avi格式的音频视频文件。 仔细看…

网络技术十二:子网划分

子网划分 A类地址 ⑴ A类地址第1字节为网络地址,其它3个字节为主机地址。另外第1个字节的最高位固定为0。 ⑵ A类地址范围:1.0.0.1到126.255.255.254。 ⑶ A类地址中的私有地址和保留地址: ①10.0.0.0到10.255.255.255是私有地址&#xff0…

mockito框架使用总结

目录 一、mock测试1.1 mock测试1.2 相关概念1.3 mock的好处 二、Mockito框架2.1 快速入门2.2 基础语法2.2.1 生成mock对象2.2.2 设置预期2.2.3 检验调用结果2.2.4 参数匹配器2.2.5 参数捕捉器2.2.6 mock静态方法调用 三、集成junit3.1 集成junit43.2 集成junit4spring3.1 集成j…

java 编程 7个简单的调优技巧

你的Java性能调优有救了!分享7个简单实用的Java性能调优技巧 一、以编程方式连接字符串 在Java中有很多不同的连接字符串的选项。比如,可以使用简单的或、良好的旧StringBuffer或StringBuilder。 那么,应该选择哪种方法? 答案取…

CSS basics

CSS(Cascading Style Sheets,层叠样式表)是样式化web内容的代码。CSS基础将引导您开始所需的内容。我们将回答这样的问题:我如何把文本变成红色?我如何使内容显示在(网页)布局的某个位置?我如何用背景图片和颜色装饰我的网页? 1、What is CSS? 像HTML一样&…

Android Jetpack架构组件库:Hilt

一、开发者官网关于Hilt库使用链接如下 使用 Hilt 实现依赖项注入 Hilt版本说明 二、工程目录图 请点击下面工程名称,跳转到代码的仓库页面,将工程 下载下来 Demo Code 里有详细的注释 代码:LearnJetpack-hilt:hilt版本2.48 代…

生成订单30分钟未支付,则自动取消,该怎么实现?

今天给大家上一盘硬菜,并且是支付中非常重要的一个技术解决方案,有这块业务的同学注意自己试一把了哈! 在开发中,往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户…

sqlserver 查询数据显示行号

查询的数据需要增加一个行号 SELECT ROW_NUMBER() OVER(ORDER BY witd_wages_area ,witd_wages_type ,witd_department_id ,witd_give_out_time) 行号,ISNULL(witd_wages_area, 0) witd_wages_area ,witd_wages_type ,witd_department_id ,ISNULL(CONVERT(VARCHAR(7), witd_gi…

《逃出大英博物馆》B站千万播放,国风文化才是主流

8月两位UP主煎饼果仔呀、夏天妹妹联合共创了一支短剧《逃出大英博物馆》,自预告释出以来就受到广泛关注,微博话题超5亿次阅读。 2023年初,大英博物馆被盗的消息引发全球关注,有网友留言,希望“拍一部动画片&#xff0…

PyTorch多GPU训练模型——使用单GPU或CPU进行推理的方法

文章目录 1 问题描述2 模型保存方式3 单块GPU上加载模型4 CPU上加载模型5 总结 1 问题描述 PyTorch提供了非常便捷的多GPU网络训练方法:DataParallel和DistributedDataParallel。在涉及到一些复杂模型时,基本都是采用多个GPU并行训练并保存模型。但在推…