首页 > 其他分享 >单例模式

单例模式

时间:2023-11-06 21:12:10浏览次数:30  
标签:singleton 单例 对象 模式 IdlerSingleton 饿汉 HungrySingleton

单例模式

引言

  单例设计模式是 23 种设计模式中最简单、使用最多的设计模式,也是必须掌握的一个设计模式。

定义

单例模式为系统中的类只允许实例化唯一一个对象这类典型问题提供的解决方案。

  许多时候系统只需要拥有一个的全局对象,比如系统中的日历 Calendar 类就只需要一个日历对象,因为所有人的日历都是一样的,可以共享一个全局日历对象,所以 JDK 将 Calendar 类用单例模式设计为单例类。

特点

  • 单例类只能有实例化一个对象
  • 单例类必须自己创建自己的唯一实例化对象
  • 单例类必须给所有其他对象提供统一的对象引用方法

实现

单例模式的实现方式主要有两种:懒汉式单例和饿汉式单例

  • 懒汉式

对于懒汉式,我们可以只在真正需要使用对象时才去创建该单例类对象:

	//懒汉式
	public class IdlerSingleton {
		//volatile 关键字
		//解决 JVM 在实例化对象时会进行优化和指令重排序操作导致的空指针问题,
		//保证其指令执行的顺序与程序指明的顺序一致,不会发生顺序变换。
		private static volatile IdlerSingleton singleton = null;

		private IdlerSingleton() {
	
		}

		public static IdlerSingleton getInstance() 	{ 
			if ( singleton == null) {
				// 线程同步
				synchronized(IdlerSingleton.class) {
					//双重检查锁模式
					if ( singleton == null) {
					singleton = new IdlerSingleton();
					}
				}
			}
			return singleton;
		}
	}

优点:

资源利用率高(第一次调用方法时才进行对象实例化)

缺点:

1.线程不安全(解决办法就是加锁 synchonized)

2.第一次加载时不够快(多线程使不必要的同步开销大)

  • 饿汉式

对于饿汉式,我们可以在类加载时已经创建好该单例对象,等待被程序使用:

	//饿汉式
	public class HungrySingleton {
		private static final HungrySingleton SINGLETON = new HungrySingleton();

		private HungrySingleton() {
		
		}
	
		public HungrySingleton getInstance() {
		return SINGLETON;
		}
	}

优点:

1.线程安全(不需要线程同步)

2.第一次调用时反应速度快(类加载即实例化对象)

缺点:

资源利用率不高(即无论是否使用都将占据内存空间)

总结

1.单例模式常见的写法有两种:懒汉式、饿汉式

2.一般采用饿汉式(追求性能)

标签:singleton,单例,对象,模式,IdlerSingleton,饿汉,HungrySingleton
From: https://www.cnblogs.com/cjw2002/p/17813735.html

相关文章

  • 设计模式—结构型模式之桥接模式
    设计模式—结构型模式之桥接模式将抽象与实现解耦,使两者都可以独立变化。在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于Photoshop这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m种形状和n种颜色的图形就有m×n......
  • 读书笔记——《软件需求模式》其一
    《软件需求模式》是StephenWithall撰写的一本重要著作,旨在探讨和提供关于软件需求工程的模式和技术。本书深入剖析了软件需求工程的各个方面,并通过引入一系列软件需求模式,为软件开发人员提供了解决常见问题和挑战的实用解决方案。作者首先强调了需求工程的重要性,指出清晰、准确......
  • mysql 大小写问题和非严格模式
    mysql大小写问题mysqlselect语句,我们输入不管大小写都能查询到数据,例如:输入aaa或者aaA、AAA都能查询同样的结果,说明查询条件对大小写不敏感。解决方案一:于是怀疑Mysql的问题。做个实验:直接使用客户端用sql查询数据库。发现的确是大小不敏感。#DDLCREATETABLE`tb_emp`......
  • c#中switch常用模式
    声明模式首先检查value的类型,然后根据类型输出相应的消息publicvoidShowMessage(objectvalue){switch(value){caseinti:Console.WriteLine($"valueisint:{i}");break;caselongl:Console.WriteLine($"valueislong:{l}");break;......
  • Java设计模式之桥接模式
    桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。假如你有一个几何形状(Shape)类,从它能扩展出两个子类:圆形(Circle)和方形(Square)。你希望对这样的类层次结构进行扩展以使其包含颜色,所......
  • java设计模式之适配器模式
    定义将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。......
  • 设计模式六大原则
    前言什么是设计模式?设计模式是软件设计人员、软件开发人员在程序代码编写中总结出来的一套编码规范,设计模式起一个指导作用,用来指导我们写出高内聚低耦合,具有良好的可扩展性和可维护性的代码。为什么要学设计模式?当然,设计模式不是非学不可,不了解设计模式一样可以在工作中写出......
  • 实验8:适配器模式
    实验8:适配器模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解适配器模式的动机,掌握该模式的结构;2、能够利用适配器模式解决实际问题。 [实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。实验要求:1. 画出对应的类图;2.提......
  • 实验9:桥接模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解桥接模式的动机,掌握该模式的结构;2、能够利用桥接模式解决实际问题。 [实验任务一]:两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。实验要求:1. 画出对应......
  • 实验7:单例模式
    实验7:单例模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解单例模式的动机,掌握该模式的结构;2、能够利用单列模式解决实际问题。 [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1. 画出对应的类图;2.提交......