前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java设计模式 —— 单例模式

Java设计模式 —— 单例模式

作者头像
Designer 小郑
发布2023-08-01 09:33:41
1890
发布2023-08-01 09:33:41
举报
文章被收录于专栏:跟着小郑学JAVA

本文原创首发CSDN,链接 https://blog.csdn.net/qq_41464123/article/details/106452022 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本段内容,尤其是脚本之家、码神岛等平台,谢谢配合。


最近在学习软件工程中的设计模式,学一个总结一个。

方便自己,方便他人。


概念

单例模式指的是一个类只有一个实例对象,且这个类能自行创建这个实例对象的一种模式。比如,我们的Windows 系统只能打开一个任务管理器,避免系统资源浪费或者产生一些不必要的错误。

在某些场合,我们为了节省内存、或者说为了保证数据内容的一致性,对某些类要求只能创建一个实例对象,这就是Java设计模式中的单例模式。

在我们平时办公的时候,比如桌面上的回收站、任务栏可打开的任务管理器,这些就是单例模式很好的说明。


特点

1. 单例类只有一个实例对象,不能实例化多个对象

2. 该类的构造函数是私有的,即对象必须由单例类自行创建

3. 该类必须有一个公有的对象获取方法,即对外提供一个访问该单例对象的接口


实现

单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。 


1. 懒汉式单例

类加载时没有生成实例化对象,只有当第一次调用获取实例方法时才去创建这个单例对象。

核心代码:

当私有对象为null,创建对象;当私有对象已存在,则返回这个对象。

代码语言:javascript
复制
if(cat == null) {
	cat =new Cat("懒汉式单例cat");
	System.out.println("产生了新的单例cat");
}else {
	System.out.println("单例cat已经存在");
}

完整代码:

其中关键字 volatile 和 synchronized是为了保障多线程环境下的安全问题,但同时会影响性能,且消耗更多的资源,这是懒汉式单例的缺点

代码语言:javascript
复制
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;
	}
}

执行后输出:

代码语言:javascript
复制
产生了一个Cat对象:懒汉式单例cat
产生了新的单例cat
单例cat已经存在
两只猫相同

因为第一次创建Cat对象的时候,因为变量cat为空,所以创建;第二次创建对象的时候发现cat不为空,则直接返回这个对象。最后比较这两个对象,结果相同。


本文原创首发CSDN,链接 https://blog.csdn.net/qq_41464123/article/details/106452022 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本段内容,尤其是脚本之家、码神岛等平台,谢谢配合。


2. 饿汉式单例

类一旦加载就创建一个单例,保证在调用 获取对象方法之前单例已经存在了。

核心代码:

代码语言:javascript
复制
private static volatile Dog dog=new Dog("饿汉式单例Dog");

public static Dog getDog() {
	return dog;
}

当类创建的时候,直接new一个Dog对象,后续获取该对象的时候,直接返回即可。

完整代码:

代码语言:javascript
复制
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;
	}
}

输出结果:

代码语言:javascript
复制
产生了一个Dog对象:饿汉式单例Dog
两只狗相同

因为类初始化的时候就创建了对象,后续调用的方法都是返回这个对象,所以只在初始化的时候创建了一次,两个对象相同。


总结

总而言之,单例模式就是说一个类只能创建一个对象,当创建多个对象的时候,返回第一次创建的对象,其通过构造函数私有化来保证实现。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 特点
    • 1. 单例类只有一个实例对象,不能实例化多个对象
      • 2. 该类的构造函数是私有的,即对象必须由单例类自行创建
        • 3. 该类必须有一个公有的对象获取方法,即对外提供一个访问该单例对象的接口
        • 实现
          • 1. 懒汉式单例
            • 2. 饿汉式单例
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档