全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

设计模式之单例模式

发布时间:2023-06-12 14:48:00
发布人:zyh

  前言

  本文主要讲述单例模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。

设计模式之单例模式

  一. 什么是单例模式

  单例模式是23种设计模式中创建型模式的一种,通过单例模式的方法创建的类在当前进程或者线程中只有一个实例。单例模式有两种比较常见的实现方式:饿汉式、懒汉式

  二. 生活中的单例模式

  1.父母

  古语有云:身体发肤,受之父母。咱们每个人包括小编自己也是,都是父母的爱情结晶。亲生的父母永远只会有一对,而你未来的孩子也是一样,也只有一对亲生父母,这就跟单例模式很相似。

1685955955699.image

  2.婚姻

  每个人都渴望拥有能够完美的爱情,与相爱之人步入婚姻的殿堂,携手共度余生。而单例模式就像咱们的生活中的婚姻一样,不管你是否有过婚姻,还是有过多少段婚姻,你的合法妻子最多只会有一个,不可能有多个。婚姻中的伴侣就跟单例模式很相似。

1685956226071.image

  3.人生

  每个人的人生都是不相同的,没有两个一样的独立个体,毕竟每个人的生活经历、成长环境、性格等等都是不一样的,所以造就了独一无二的你。而你就是单例模式最好的表现。

1685956231658.image

  三. 单例模式的实现

  接下来咱们就来讲下最基础的两种单例模式实现方式:饿汉式、懒汉式。

  1.饿汉式

  接下来小编以婚姻中的夫妻对象来举例,使用饿汉式来实现。首先来创建一个饿汉式类和客户端。 

package com.qianfeng.ran

/*
* @author:小编
*
* 由饿汉式创建的类:老婆类
*/
public class Wife{
//创建一个自身实例对象的私有化静态属性
private static Wife wife = new Wife();

//创建私有化无参构造方法
private Wife(){
}
//创建一个供外界获取当前实例对象的公开静态方法
public static Wife getInstance(){
return wife;
}
}

class Demo{
public static void main(String[] args) {
Wife wife1 = Wife.getInstance();
Wife wife2 = Wife.getInstance();
//执行结果:
//true
System.out.println(wife1 == wife2);
}
}

  从上面案例可以看出,构造方法被私有化后,我们只能通过它提供的方法 getInstance() 来获取当前类的实例对象,而我们每次获取的对象都会是同一个,所以 Wife 是个单例模式的类。

  而从 Wife 类中我们能看得到它有个静态的私有属性,这个私有属性就是当前类的实例对象。也就是说不管我们还没有调用这个类,类中的静态对象属性在加载进内存中的时候已经存在了,这个就是饿汉式的特点。

  饿汉式就婚姻里的对象一样,他(她)一早就出现在这个世上,只是需要你们彼此寻找到对方而已。

  2. 懒汉式

  接下来小编再以孩子为例,用懒汉式实现。创建一个懒汉式类和客户端。  

package com.qianfeng.ran

/*
* @author:江帅
*
* 由懒汉式创建的类:孩子类
*/
public class Child{
//创建一个类型为当前类的私有化静态属性
private static Child child;

//创建私有化无参构造方法
private Child(){
}
//创建一个供外界获取当前实例对象的公开静态方法
public static Child getInstance(){
//判断静态属性是否为 null
if(child == null){
//如果为 null 则创建当前类对象并赋值给静态属性
child = new Child();
}
return child;
}
}

class Demo{
public static void main(String[] args) {
Child child1 = Child.getInstance();
Child child2 = Child.getInstance();
//执行结果:
//true
System.out.println(child1 == child2);
}
}

  这个案例也是一样构造方法被私有化,只能通过其提供的静态方法获取其实例对象。

  在 Child 类中它也有个静态的私有属性,但是这个静态属性并没有赋值,只有在第一次调用 Child 类获取实例方法 getInstance() 的时候,才会创建当前类的实例对象并赋值给其属性并返回。因此在没有调用其方法之前,对象是没有创建的,只有等到需要的时候才会被创建,这就是懒汉式。

  懒汉式就孩子一样,他们并不会一开始就存在,只有当你创造他的时候才会存在,而你与你的对象创建出来每一胎的孩子都会是独一无二的,即使你多生几个,每一个都是唯一的。

  四. 总结

  单例模式就像生活中独一无二的事物一样,只不过有些早已存在,而有些需要你去创建。在程序中很多场景都会运用到单例模式,它能减少我们需要的对象,降低服务器的压力,提高运行效率。

  不过单例模式的两种模式中,懒汉式可能会出现线程安全问题。就像一胎生2个孩子,这样每一胎就是独立的一个对象了。

#单例模式

相关文章

强化学习是什么?

强化学习是什么?

2023-10-15
flutter为什么不使用kotlin作为开发语言?

flutter为什么不使用kotlin作为开发语言?

2023-10-15
opencv和yolo是什么样的关系?

opencv和yolo是什么样的关系?

2023-10-15
矩阵的2范数与向量的2范数有什么关系?

矩阵的2范数与向量的2范数有什么关系?

2023-10-15

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取