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

单例设计模式

目的(使用场景)

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

功能

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

方法

  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.hqwc.cn/news/101536.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

米贸搜什么是网站排名流量

当谈到数字营销时,你的网站应该作为线上营销的中心枢纽。包括:Ads付费广告、EDM邮件营销、SEO搜索引擎优化等都旨在吸引用户访问你的网站,并在网站上进行深度转化。 被广泛应用且最有效的营销策略之一就是SEO,流量排名是衡量网站受…

监控系统典型架构

监控系统典型架构如下: 从左往右看: 采集器是负责采集监控数据的,采集到数据之后传输给服务端,通常是直接写入时序库。 对时序库的数据进行分析和可视化。 告警引擎产生告警事件之后交给告警发送模块做不同媒介的通知。 可视化比…

day2_C++

day2_C 代码题思维导图 代码题 #include using namespace std;#define MAX 50struct StuData {private:int scoreArr[MAX];int num;public:void setNum(int num);void input();void sort();void show();int getnum();};void StuData::setNum(int num){this->num num; }vo…

失效的访问控制漏洞复现(dvwa)

文章目录 失效访问控制是什么?dvwa漏洞复现用未授权访问获取shell 代码审计 失效访问控制是什么? 由于缺乏自动化的检测和应用程序开发人员缺乏有效 的功能测试,因而访问控制缺陷很常见。导致攻击者可以冒充用户、管理员或拥有特权的用户&…

Android studio 实现生成二维码和扫描二维码

效果图 build.gradle(:app)添加依赖 dependencies {implementation com.google.zxing:core:3.3.3implementation com.journeyapps:zxing-android-embedded:3.6.0implementation com.google.zxing:javase:3.0.0 }Manifests.xml <uses-permission android:name"android…

Vulnhub: Masashi: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.236 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.236查看80端口的robots.txt提示三个文件 snmpwalk.txt内容&#xff0c;tftp服务在1337端口 sshfolder.txt内容&#xff0c…

三秋农忙,自动驾驶农机保驾护航

“三秋”&#xff08;收获、播种、整地&#xff09;是一年中重要而忙碌的农事季节&#xff0c;水稻、棉花、玉米等农作物收获时期&#xff0c;也是小麦、蔬菜等秋种的好时间&#xff0c;还是各类农作物进入秋管的重要期。 随者农业科技发展&#xff0c;北斗导航农机自动驾驶系…

产业大数据应用:洞察区域产业实况,把握区域经济脉搏

​ 随着新一代信息技术的崛起&#xff0c;我们进入了大数据时代。在这个时代&#xff0c;数据作为基本生产要素不仅改变着我们的日常生活&#xff0c;更是在区域产业经济发展中扮演着重要角色&#xff0c;它赋予了政府、企业和投资者敏锐的洞察力。 一、摸清区域经济现状 基于…

尚硅谷大数据项目《在线教育之离线数仓》笔记007

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第12章 报表数据导出 P112 01、创建数据表 02、修改datax的jar包 03、ads_traffic_stats_by_source.json文件 P113 P114 P115 P116 P117 P118 P119 P120 P121 P122【122_在…

代码随想录笔记--回溯算法篇

1--回溯算法理论基础 回溯算法本质上是一个暴力搜索的过程&#xff0c;其常用于解决组合、切割、子集、排列等问题&#xff0c;其一般模板如下&#xff1a; void backTracking(参数){if(终止条件){// 1. 收获结果;// 2. return;}for(..遍历){// 1. 处理节点// 2. 递归搜索// 3.…

Jmeter常用功能-参数化介绍

JMeter也有像LR中的参数化&#xff0c;本篇就来介绍下JMeter的参数化如何去实现。 参数化&#xff1a;录制脚本中有登录操作&#xff0c;需要输入用户名和密码&#xff0c;假如系统不允许相同的用户名和密码同时登录&#xff0c;或者想更好的模拟多个用户来登录系统。 这个时…

LeetCode刷题笔记【24】:贪心算法专题-2(买卖股票的最佳时机II、跳跃游戏、跳跃游戏II)

文章目录 前置知识122.买卖股票的最佳时机II题目描述贪心-直观写法贪心-优化代码更简洁 55. 跳跃游戏题目描述贪心-借助ability数组贪心-只用int far记录最远距离 45.跳跃游戏II题目描述回溯算法贪心算法 总结 前置知识 参考前文 参考文章&#xff1a; LeetCode刷题笔记【23】…