Java 单例模式-漂亮学姐要我电话号码干什么?这么关心我难道她想......让你以最难忘的例子认识单例模式!!!


小故事引入(保证以后你会追我的文章)

哇!大学开学第一天,我的高中学习没有白努力,没有荒废时光,我考到了一所很好的大学 —— 丞绪源大学!刚入学第一天,走进学校,大家都在忙着自己的事情,席不瑕暖。

我刚进学校,不知道干什么,忽然,一位穿一身翠绿衣衫,皮肤雪白,一张脸蛋清秀可爱的学姐走到我面前,她说:“这位弟弟,我可以帮到你什么?”,我一直呆呆地看着,心里打量着她,心想 “好生漂亮的女子,千秋无绝色!悦目是佳人!倾国倾城貌!惊为天下人!”。

“这位弟弟,你在想什么呢?”,她朝我挥挥手,让我好尴尬,脸红心跳地答道,“我找宿舍和教学楼,请问在哪儿呢?”,说罢,她直接牵着我的手走去,我顿时不知所措,因为我连女孩子的手都没碰过!“呐!这里就是宿舍了,我不方便上去,我在下面等你,为了表达你对我的谢意,就把电话号码给我吧!”,我便把电话号码给她了,心里那叫一个爽。

“我看你准备的东西也不齐全,连被子都没有,估计饭卡也没有办吧,晚上我带你去吃饭吧,吃完晚饭我带你去找学校外面的酒店,将就一晚上吧!”,漂亮的学姐说道…

下一篇接着讲故事:
Java 工厂模式——我和漂亮学姐的“雨后小故事”,和漂亮学姐吃完晚饭,突然下雨了…让你以最难忘的方式了解工厂模式


学姐的单例模式

使用单例模式的本意是 保证类在内存中只能有一个对象 ,单例模式有两种,一个是饿汉式,一个是懒汉式

假设学校给学姐分配任务:帮助学弟解决问题!


学姐的饿汉式单例模式

创建一个漂亮学姐(姐姐)类:

/**
 * @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() 方法!
  • 单例模式可以用于频繁地销毁、创造对象或者创建对象消耗资源过多时候使用!

本篇文章所提及大学名子为本人自拟,如有雷同,纯属巧合!

©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师: 上身试试 返回首页
实付19.90元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值