小故事引入(保证以后你会追我的文章)
哇!大学开学第一天,我的高中学习没有白努力,没有荒废时光,我考到了一所很好的大学 —— 丞绪源大学!刚入学第一天,走进学校,大家都在忙着自己的事情,席不瑕暖。
我刚进学校,不知道干什么,忽然,一位穿一身翠绿衣衫,皮肤雪白,一张脸蛋清秀可爱的学姐走到我面前,她说:“这位弟弟,我可以帮到你什么?”,我一直呆呆地看着,心里打量着她,心想 “好生漂亮的女子,千秋无绝色!悦目是佳人!倾国倾城貌!惊为天下人!”。
“这位弟弟,你在想什么呢?”,她朝我挥挥手,让我好尴尬,脸红心跳地答道,“我找宿舍和教学楼,请问在哪儿呢?”,说罢,她直接牵着我的手走去,我顿时不知所措,因为我连女孩子的手都没碰过!“呐!这里就是宿舍了,我不方便上去,我在下面等你,为了表达你对我的谢意,就把电话号码给我吧!”,我便把电话号码给她了,心里那叫一个爽。
“我看你准备的东西也不齐全,连被子都没有,估计饭卡也没有办吧,晚上我带你去吃饭吧,吃完晚饭我带你去找学校外面的酒店,将就一晚上吧!”,漂亮的学姐说道…
学姐的单例模式
使用单例模式的本意是 保证类在内存中只能有一个对象 ,单例模式有两种,一个是饿汉式,一个是懒汉式!
假设学校给学姐分配任务:帮助学弟解决问题!
学姐的饿汉式单例模式
创建一个漂亮学姐(姐姐)类:
/**
* @author 程忆难 https://myhub.blog.csdn.net
* 饿汉式
*/
public class BeautifulSister {
/**
* 创建实例,并且是私有的
*/
private static final BeautifulSister beautifulSister = new BeautifulSister();
/**
* 私有构造
*/
private BeautifulSister() {
}
/**
* 提供 public get方法,供外部使用
*
* @return
*/
public static BeautifulSister getBeautifulSister() {
return beautifulSister;
}
}
此时,如果你要调用的话,只能直接用类名调用getBeautifulSister()方法,才能获得这位漂亮学姐,你别再想new她,new急了她给你报错!也就是这样,保证类在内存中只能有这一个漂亮学姐!这就好比在 丞绪源大学(内存) 中,只有这一位漂亮学姐(BeautifulSister类)!
饿汉式是以空间换时间的方式,这就好比在这所大学,已经给定了这位学姐,她要帮助她的学弟,也就是我,这是已经给定的,直接全加载出来!
学姐的懒汉式单例模式
创建一个漂亮学姐(姐姐)类:
/**
* @author 程忆难 https://myhub.blog.csdn.net
* 饿汉式
*/
public class BeautifulSister {
/**
* 创建实例,并且是私有的
*/
private static BeautifulSister beautifulSister = null;
/**
* 私有构造
*/
private BeautifulSister() {
}
/**
* 提供 public get方法,供外部使用
*
* @return
*/
public static BeautifulSister getBeautifulSister() {
if (null == beautifulSister) {
beautifulSister = new BeautifulSister();
}
return beautifulSister;
}
}
懒汉式,只有当调用getBeautifulSister() 方法时,才会创建这位漂亮学姐,故事中提到“她直接牵着我的手走去,我顿时不知所措”,这也是在简单了解之后,知道了我要干什么,有什么疑问后,才拉我的手,总不能上来什么话也没说,直接就拉我的手,要我的电话号码!
那么如何保证懒汉式单例模式线程安全呢,意思就是保证这个学姐不受其他人的干扰,专心为我找宿舍和教学楼,要电话号码!总不能,同时服务两个学弟!这就构成了3P,在线程中是不安全的!那么,就要用到双重加锁来解决这一问题!
现在来对获取这位学姐进行双重检查加锁!
/**
* @author 程忆难 https://myhub.blog.csdn.net
* 饿汉式
*/
public class BeautifulSister {
/**
* 创建实例,并且是私有的
*/
private static BeautifulSister beautifulSister = null;
/**
* 私有构造
*/
private BeautifulSister() {
}
/**
* 提供 public get方法,供外部使用
* 双重检查
*
* @return
*/
public static BeautifulSister getBeautifulSister() {
if (null == beautifulSister) {
synchronized (BeautifulSister.class) {
if (null == beautifulSister) {
beautifulSister = new BeautifulSister();
}
}
}
return beautifulSister;
}
}
这样就保证了这位学姐先专心致志为我服务!避免了争风吃醋!
漂亮学姐的傻白甜总结
- 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能!
- 单例模式,采用了私有化构造方法,不可以new学姐(对象),只能用类名调用 get() 方法!
- 单例模式可以用于频繁地销毁、创造对象或者创建对象消耗资源过多时候使用!
本篇文章所提及大学名子为本人自拟,如有雷同,纯属巧合!
共同学习,写下你的评论
评论加载中...
作者其他优质文章