type
status
date
slug
summary
tags
category
icon
password
单例模式
单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
- 只有一个实例的意思是,在整个应用程序中,只存在该类的一个实例对象,而不是创建多个相同类型的对象。
- 全局访问点的意思是,为了让其他类能够获取到这个唯一实例,该类提供了一个全局访问点(通常是一个静态方法),通过这个方法就能获得实例。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F0ab7211a-f4a0-428f-91c1-18261f433003%2FUntitled.png?table=block&id=1bb8a531-5c91-4ef9-82b6-64e3297f1ae4&t=1bb8a531-5c91-4ef9-82b6-64e3297f1ae4&width=1280&cache=v2)
单例模式结构
- 私有的构造函数:防止外部代码直接创建类的实例
- 私有的静态实例变量:保存该类的唯一实例
- 公有的静态方法:通过公有的静态方法来获取类的实例
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2Fcd47788e-a922-45bb-a258-f0f60f8e925f%2FUntitled.png?table=block&id=6622ecbb-89f2-4961-9ad7-adab48115788&t=6622ecbb-89f2-4961-9ad7-adab48115788&width=944&cache=v2)
单例模式通用代码
单例模式的实现方式有多种,包括懒汉式、饿汉式等。
- 饿汉式指的是在类加载时就已经完成了实例的创建,不管后面创建的实例有没有使用,先创建再说,所以叫做 “饿汉”。
- 而懒汉式指的是只有在请求实例时才会创建,如果在首次请求时还没有创建,就创建一个新的实例,如果已经创建,就返回已有的实例,意思就是需要使用了再创建,所以称为“懒汉”。
饿汉模式
懒汉模式
在懒汉模式的基础上,可以使用双重检查锁来提高性能。
有上限的多例模式,它是单例模式的一种扩展,采用有上限的多例模式,我们可以在设计时决定在内存中有多少个实例,方便系统进行扩展,修正单例可能存在的性能问题,提供系统的响应速度。
单例模式适用场景
- 如果程序中的某个类对于所有客户端只有一个可用的实例, 可以使用单例模式。
单例模式禁止通过除特殊构建方法以外的任何方式来创建自身类的对象。 该方法可以创建一个新对象, 但如果该对象已经被创建, 则返回已有的对象。
- 如果你需要更加严格地控制全局变量, 可以使用单例模式。
单例模式与全局变量不同, 它保证类只存在一个实例。 除了单例类自己以外, 无法通过任何方式替换缓存的实例。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2Fcb82d6fc-155a-474a-a21c-594e48eb0cdd%2FUntitled.png?table=block&id=927d1a3e-97c5-4924-a067-90a99ef38983&t=927d1a3e-97c5-4924-a067-90a99ef38983&width=703&cache=v2)
识别方法: 单例可以通过返回相同缓存对象的静态构建方法来识别。
单例模式优缺点
单例模式优点:
- 你可以保证一个类只有一个实例。
- 你获得了一个指向该实例的全局访问节点。
- 仅在首次请求单例对象时对其进行初始化。
单例模式缺点:
- 违反了单一职责原则。 该模式同时解决了两个问题。
- 单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
- 单例模式可能掩盖不良设计, 比如程序各组件之间相互了解过多等。
- 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象。
- 单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。 由于单例类的构造函数是私有的, 而且绝大部分语言无法重写静态方法, 所以你需要想出仔细考虑模拟单例的方法。 要么干脆不编写测试代码, 或者不使用单例模式。
练手题目
题目描述
小明去了一家大型商场,拿到了一个购物车,并开始购物。请你设计一个购物车管理器,记录商品添加到购物车的信息(商品名称和购买数量),并在购买结束后打印出商品清单。(在整个购物过程中,小明只有一个购物车实例存在)。
输入描述
输入包含若干行,每行包含两部分信息,分别是商品名称和购买数量。商品名称和购买数量之间用空格隔开。
输出描述
输出包含小明购物车中的所有商品及其购买数量。每行输出一种商品的信息,格式为 "商品名称 购买数量"。
输入示例
Apple 3 Banana 2 Orange 5
输出示例
Apple 3 Banana 2 Orange 5
提示信息
本道题目请使用单例设计模式, 使用私有静态变量来保存购物车实例。 使用私有构造函数防止外部直接实例化。
题解
1.简单单例模式实现。
2.在懒汉模式的基础上,可以使用双重检查锁来提高性能。
欢迎您在底部评论区留言,一起交流~
- 作者:Nolan
- 链接:https://nolanblog.top/article/DP1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。