设计模式(六)—— 单例模式(定义、案例分析、特点、缺点)

本文详细探讨了设计模式中的单例模式,包括其定义、应用场景、五种实现方式(饿汉式、懒汉式、双重检查锁定、静态内部类、枚举方式)及其优缺点。单例模式确保类只有一个实例,提供全局访问点,适用于资源管理或系统只需要一个实例的情况。文章还指出,单例模式的扩展性较差,并讨论了其在多线程和序列化攻击下的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。


本篇的单例模式可以说是我们使用率非常高也非常常见的设计模式!

正文

一、定义

单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。是一个对象创建模式。
在这个模式中,我们要特别关注怎么实现单例。这个就是最大的难点,而目前单例模式其实有非常多的实现方式,下面我们先讲述一个小案例理解,之后拓展饿汉式和懒汉式。

二、情景假设

在操作系统中,打印池(Print Spooler)是一个用于管理打印任务的应用程序,通过打印池用户可以删除、中止或者改变打印任务的优先级,在一个系统中只允许运行一个打印池对象,如果重复创建打印池则抛出异常。现使用单例模式来模拟实现打印池的设计。

类图比较简单,主要关注属性和方法该怎么编写,下面看分析

三、情景分析

关于上面情景的类图(具体分析在下面)
在这里插入图片描述
首先我们要知道我们在new一个对象,先调用的是什么方法?对了!构造方法,所以每new一次就会创建一下,那么我们既然想要控制不会随便的构建,我们能想到第一步就是让构造函数私有化,再者问题来了,构造函数都私有化了,我怎么new??所以原来构造函数走不通了,那么我们就需要通过另外的入口去创建,有人可能会问我对象都创建不出来我怎么调用里面另外的借口去创建,太矛盾了这!确实是个问题,但不知道大家想起了类方法吗?没错我们可以设定为static,通过类去调用类方法去创建对象,然后还没完!我们还要定义一个变量去存第一次创建的这个实例,因为后续如果又想创建对象,这时候我们可以通过这个变量就知道是不是创建好了,如果创建好了就返回这个实例,否则我们就新建,注意这个私有变量是static的,因为static方法只能使用static属性。

//单例类PrintSpoolerSingleton
public class PrintSpoolerSingleton
{
   
	//静态属性存储实例
	public static PrintSpoolerSingleton instance = null;
	//私有化构造函数,避免对外的重复创建
	private PrintSpoolerSingleton(){
   }
	//自建对外创建借口,并设定为类方法
	public staticPrintSpoolerSingleton getInstance() throws PrintSpoolerException{
   
		if(instance == null){
   
			System.out.println("创建打印池");
			instance = new PrintSpoolerSingeleton();
		} else {
   
			throw new PrintSpoolerExcption("打印池正在工作中!");
		}
		return instance;
	}

	//打印池的方法
	public void manageJobs(){
   
		System.out.println("管理打印任务");
	}
}

//下面是自定义的打印池Exception类
public class PrintSpoolerException
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值