专业编程基础技术教程

网站首页 > 基础教程 正文

什么是单例模式?(什么是单例模式和工厂模式)

ccvgpt 2024-07-28 12:11:09 基础教程 8 ℃

一、什么是单例?

1.单例:一个对象;

单:一个

什么是单例模式?(什么是单例模式和工厂模式)

例:实例(对象)

2.有些类,在整个应用程序运行期间,只需要一个对象;这个类就可以设计为"单例模式"

3.设计单例模式的原则:

1).不能允许任何类来任意的实例化此类对象;将构造方法"私有化";

2).定义私有、静态的本类类型的成员变量,并初始化(饿汉式);

3).提供一个公有的、静态的get方法,获取此成员变量的引用;

二、为什么要用到单例?

1、单例模式节省公共资源

比如:一个村的村民都要喝水,但是没必要每户家里都打一口井是吧,通常的做法是整个村里打一个井就够了,大家都从这个井里面打水喝。

对应到我们计算机里面,像日志管理、打印机、数据库连接池、应用配置。

2、单例模式方便控制

就像日志管理,如果多个人同时来写日志,你一笔我一笔那整个日志文件都乱七八糟,如果想要控制日志的正确性,那么必须要对关键的代码进行上锁,只能一个一个按照顺序来写,而单例模式只有一个人来向日志里写入信息方便控制,避免了这种多人干扰的问题出现。

三、什么场景下会用到单例?

前段时间生产环境下遇到一个问题,系统每隔10分钟左右就会宕机,经过1个小时的排查发现系统每次重启后可以正常运行10分钟左右,然后redis就崩溃了,redis崩溃之导致诸多使用到redis的功能无法正常运行从而使系统宕机,于是乎从redis的客户端入手开始寻找问题,因为为了方便在业务代码中操作redis,所以把redis的客户端封装成了一个工具类(一个小弟写的,我之前未仔细检查),在使用过程中直接通过工具类获取连接就行。

因为这个工具类封装的时候不规范,在每次获取连接的时候都会实例化一个客户端对象,从而导致实例化的对象太多了导致redis崩溃拿不到连接了。

找到问题之后接下来就是要改造代码了,这个时候单例就派上用场了。

四、单例的实现思路

1、构造方法私有化

2、以静态私有成员变量,并初始化

3、提供公共的静态方法返回实例

五、单例的实现方式之饿汉式

什么是饿汉式?

饿汉式也叫做饥汉式,饿汉式的意思是,我先把对象(食物)创建好,等我要用(吃)的直接直接来拿就行了。这种模式是最简单最省心的,不足的地方是容易造成资源上的浪费(比如:我事先把面包都做好了,但是你并不一定吃,这样容易造成资源的浪费)。



package com.entity;

/**

@Descrption:单例模式之饿汉式

@author:lizhilun

*/

public class Student {

private static Student stu = new Student();

private Student(){


}

public static Student getInstance(){

return stu;

}

}


六、单例的实现方式之懒汉式

什么是懒汉式?

顾名思义,他是一个懒汉,他不愿意动弹。什么时候需要吃饭了,他就什么时候开始想办法搞点食物。即懒汉式一开始不会实例化,什么时候用就什么时候new,才进行实例化。



package com.entity;

/**

@Descrption:单例模式之懒汉式

@author:lizhilun

*/

public class Student {

private static Student stu;

private Student(){


}

public static synchronized Student getInstance(){

if(stu == null){

stu = new Student();

}

return stu;

}

}

七、两种单例模式的区别

  • 线程安全方面区别

饿汉式在线程还没出现之前就已经实例化了,所以饿汉式一定是线程安全的。懒汉式加载是在使用时才会去new 实例的,那么你去new的时候是一个动态的过程,如果开启了多线程那么可能就会出现多个实例的情况出现,所以在实例化对象时要加上同步锁

  • 执行效率区别

饿汉式没有加任何的锁,因此执行效率比较高。懒汉式一般使用都会加同步锁,效率比饿汉式差。

  • 内存使用区别

饿汉式在一开始类加载的时候就实例化,无论使用与否,都会实例化,所以会占据空间,浪费内存。懒汉式什么时候用就什么时候实例化,不浪费内存。

以上就是单例的初步介绍,其实这样也不一定完全能够保证单例,比如说依然可以通过反射来构建出多个实例的存在,这个我在后面的文章中会给大家介绍到。

Tags:

最近发表
标签列表