java23种设计模式面试常被问到的单利模式讲解
最近在学习软件工程中的设计模式,学一个总结一个。
方便自己,方便他人。
概念
单例模式指的是一个类只有一个实例对象,且这个类能自行创建这个实例对象的一种模式。比如,我们的Windows 系统只能打开一个任务管理器,避免系统资源浪费或者产生一些不必要的错误。
在某些场合,我们为了节省内存、或者说为了保证数据内容的一致性,对某些类要求只能创建一个实例对象,这就是Java设计模式中的单例模式。
在我们平时办公的时候,比如桌面上的回收站、任务栏可打开的任务管理器,这些就是单例模式很好的说明。
特点
1. 单例类只有一个实例对象,不能实例化多个对象
2. 该类的构造函数是私有的,即对象必须由单例类自行创建
3. 该类必须有一个公有的对象获取方法,即对外提供一个访问该单例对象的接口
实现
单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。
1. 懒汉式单例
类加载时没有生成实例化对象,只有当第一次调用获取实例方法时才去创建这个单例对象。
核心代码:
当私有对象为null,创建对象;当私有对象已存在,则返回这个对象。
- if(cat == null) {
- cat =new Cat("懒汉式单例cat");
- System.out.println("产生了新的单例cat");
- }else {
- System.out.println("单例cat已经存在");
- }
完整代码:
其中关键字 volatile 和 synchronized是为了保障多线程环境下的安全问题,但同时会影响性能,且消耗更多的资源,这是懒汉式单例的缺点
- package ypc.zwz.DanLi;
- public class LanHan {
- public static void main(String[] args) {
- Cat cat01 = Cat.getCat();
- Cat cat02 = Cat.getCat();
- if(cat01 == cat02) {
- System.out.println("两只猫相同");
- }else {
- System.out.println("两只猫不同");
- }
- }
- }
- class Cat{
- private static volatile Cat cat=null;
- private String name;
- private Cat(String name) {
- System.out.println("产生了一个Cat对象:" + name);
- }
- public static synchronized Cat getCat() {
- if(cat == null) {
- cat =new Cat("懒汉式单例cat");
- System.out.println("产生了新的单例cat");
- }else {
- System.out.println("单例cat已经存在");
- }
- return cat;
- }
- public String getName() {
- return this.name;
- }
- }
执行后输出:
- 产生了一个Cat对象:懒汉式单例cat
- 产生了新的单例cat
- 单例cat已经存在
- 两只猫相同
因为第一次创建Cat对象的时候,因为变量cat为空,所以创建;第二次创建对象的时候发现cat不为空,则直接返回这个对象。最后比较这两个对象,结果相同。
2. 饿汉式单例
类一旦加载就创建一个单例,保证在调用 获取对象方法之前单例已经存在了。
核心代码:
- private static volatile Dog dog=new Dog("饿汉式单例Dog");
- public static Dog getDog() {
- return dog;
- }
当类创建的时候,直接new一个Dog对象,后续获取该对象的时候,直接返回即可。
完整代码:
- package ypc.zwz.DanLi;
- public class EHan {
- public static void main(String[] args) {
- Dog dog01 = Dog.getDog();
- Dog dog02 = Dog.getDog();
- if(dog01 == dog02) {
- System.out.println("两只狗相同");
- }else {
- System.out.println("两只狗不同");
- }
- }
- }
- class Dog{
- private static volatile Dog dog=new Dog("饿汉式单例Dog");
- private String name;
- private Dog(String name) {
- System.out.println("产生了一个Dog对象:" + name);
- }
- public static Dog getDog() {
- return dog;
- }
- public String getName() {
- return this.name;
- }
- }
输出结果:
- 产生了一个Dog对象:饿汉式单例Dog
- 两只狗相同
因为类初始化的时候就创建了对象,后续调用的方法都是返回这个对象,所以只在初始化的时候创建了一次,两个对象相同。
总结
总而言之,单例模式就是说一个类只能创建一个对象,当创建多个对象的时候,返回第一次创建的对象,其通过构造函数私有化来保证实现。
如果你是刚开始学习java,或者刚开始从事java行业,有很多的问题都可以关注微信公众号: java学长 ,一个致力于打造免费指导学习java高薪就业的公益平台!点赞、关注 哦,不定期分享程序员的骚操作和强势浪漫!
java23种设计模式面试常被问到的单利模式讲解相关推荐
- JAVA23种设计模式学习,源码+案例分析+类图讲解
本文对JAVA中23种设计模式进行了简单的讲解,幷加以实际案例进行辅助理解,每种模式都会举例说明,幷将源码开源至gitee和githbu上.JAVA目录下为源码,resources目录下的UML文件夹 ...
- Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解
源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...
- 走穿java23种设计模式-15责任链模式详解
走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...
- JAVA23种设计模式(2)-结构型模式7种
JAVA23种设计模式(2)-结构型模式7种 把类结合在一起形成更大的结构 适配器模式(adapter) 一句话:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 这是平时比较常见的一种模 ...
- 23种设计模式(常见面试题)
23种设计模式(常见面试题) 1.什么是设计模式? 答: 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.是一套用来提高代码可复用性.可维护性.可读性 ...
- 走穿java23种设计模式--18中介者模式详解
走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...
- 深入浅出Java23种设计模式(一)
文章目录 关于设计模式 六大设计原则 开闭原则(Open Close Principle) 里氏代换原则(Liskov Substitution Principle) 依赖倒转原则(Dependenc ...
- java23种设计模式(追妹妹版)
设计模式做为程序员的"内功心法",越来越受到重视.这是一篇通俗版23种设计模式,用实际生活做比喻,让你很快就能理解其中的深意. 1.FACTORY―追MM少不了请吃饭了,麦当劳的鸡 ...
- java-23种设计模式详解(一)
2019独角兽企业重金招聘Python工程师标准>>> 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反 ...
最新文章
- Angular4.0从入门到实战打造在线竞拍网站学习笔记之四--数据绑定管道
- SSM高级整合项目实战
- undefined reference to `cv::VideoCapture::VideoCapture()‘
- C++语言程序设计视频教程_清华大学_郑莉(基础篇+进阶篇)
- 永不停止的程序。。。
- 不安装oracle客户端如何用plsql连接oracle
- python倒三角形粉色填充笔的形状海龟_Python001-Turtle(海龟绘图)详解
- android让一个控件跟上面控件对其,学个明白--Android控件架构
- 开启Cisco交换机DHCP Snooping功能
- 2017.10.24 学校食堂Dining 失败总结
- java abs在哪个包,Java StrictMath abs()方法
- linux git 搭建 debian,基于Debian Linux搭建Git服务器
- 简历javaweb项目描述怎么写_JavaWeb开发项目经验简历范文
- ps制作2寸照片教程蓝底,ps怎么p二寸照片详细步骤
- 龙门架式焊接机器人_一种龙门架式焊接机械手的制作方法
- 坐标转换—高斯正反算(附测量助理最新版软件下载)
- access是干什么的软件
- C++关于string类的模拟实现
- Python 英文文本字母跳转概率统计
- 如何在Debian下安装Webmin
热门文章
- 用降群的方法来解算还原魔方的步骤C++
- 树莓派cups搭建无线打印机(HP Laserjet 1020)
- SQL中UNPIVOT是什么
- cad net 绘制带圆弧的多段线
- webp文件怎么打开?webp压缩工具推荐
- JAVA社交平台项目第四天 消息通知系统
- 大华摄像头java开发之抓图
- 【基金学习】小白基金学习记录(一)
- 安装ros系统出现 404 Not Found [IP: 91.189.91.38 80]
- ActiveMQ系列—ActiveMQ中的Queue和Topics