【JavaEE】单例模式设计

简介: 哈喽,大家好~我是保护小周ღ,本期为大家带来的是 Java 设计模式中的单例模式,采用两种方式来实现——“饿汉”模式 和 “懒汉” 模式 。确定不来看看嘛~更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

 

image.gif编辑

哈喽,大家好~我是保护小周ღ,本期为大家带来的是 Java 设计模式中的单例模式,采用两种方式来实现——“饿汉”模式 和 “懒汉” 模式 。确定不来看看嘛~更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

image.gif编辑


一、设计模式

什么是设计模式,通俗易懂的讲:在我们软件开发中会遇到许多常见的“问题场景”,针对这些问题每个人都有自己程序设计方法,代码质量各有千秋,为了在某些场景下的代码结构,大佬就总结出一些固定的套路来应对这些场景,那么按照大佬的代码套路,开发效率就是杠杠的,也不会出错,大佬总结的套路这个就看作是设计模式。

单例模式能够保证某个类在程序中只存在 “唯一” 一份实例,而不会创建出多个实例对象。

根据具体需求来分析是否使用该设计模式


Java 中单例模式就是借助 Java语法,保证某个类,只能够创建出一个实例化的对象,只能够 new 一次。

单例模式具体的实现方式有很多种,这里博主只讲述两种 “饿汉” 和 “懒汉” 两种。

举个例子形容一下什么叫 “饿汉” 和 “懒汉”:

张三周末放假在家休息,打游戏放松心情,玩着玩着肚子咕咕叫,没错肚子饿了,此时张三给队友发了一条信息:“兄弟们,我肚子饿了,要去吃饭了,拜拜~” ,任由队友如何让 “劝说” ,张三还是放下未打完的游戏就去做饭去了,秉着天大地大,吃饭最大的态度,从容抛弃了队友。

张三此时可以看作是 “饿汉模式”,其中就带有点急迫的意思,有需要就行动


张三周末放假在家休息,打游戏放松心情,玩着玩着肚子咕咕叫,没错肚子饿了,但是有影响吗?没有影响,张三表示跟队友一起玩游戏非常的开心呢,吃饭这种事儿,只要饿不死都不是问题吖,然后继续愉快开黑中,直到玩的手软,没有力气了,此时张三表示,还得是吃饱了才有力气愉快玩耍吖,吃点什么好呢,做饭?不可能做饭的,点外卖吧~

张三此时可以看作是 “懒汉模式”,其中就多了一丝从容,不到最后一刻不行动


二、“饿汉” 实现单例

public class HungryMode {
    // 在类的內部已经实例化好了对象,且是静态的
    private static HungryMode hungryMode = new HungryMode();
    /**
     * 通过静态方法来返回对象的引用
     * 静态方法属于类方法,不依托与对象,使用类名即可调用
     * @return
     */
    static public HungryMode getHungryMode() {
        return hungryMode;
    }
    /*自定义构造方法,使用 private 修饰,类外不得创建对象,创建对象系统对自动调用构造方法
      我们重写了构造方法,系统就调用重写后的构造方法,此时我们 使用 private 修饰构造,
      所以就会造成对象无法实例化成功*/
    private HungryMode() { }
}
class Test {
    public static void main(String[] args) {
        HungryMode hungryMode1 = HungryMode.getHungryMode();
        HungryMode hungryMode2 = HungryMode.getHungryMode();
        System.out.println(hungryMode1.equals(hungryMode2));
    }
}

image.gif

image.gif编辑

该设计模式是多线程安全的。

造成多线程不安全的因素:

不会出现多线程同时对一块内存数据修改的情况,该类只利用方法返回一个实例化对象的引用。

该代码也不会存在内存可见性问题。


三、“懒汉” 实现单例

public class LazybonesMode {
    // volatile 关键字保证内存可见性以及防止指令重排序
    volatile private static LazybonesMode lazybonesMode = null;
    public static LazybonesMode getLazybonesMode() { //非必要不创建实例化对象
        if(lazybonesMode == null) { // 避免重复加锁,只需要 new 一个对象
            synchronized (LazybonesMode.class) { // 加锁保证多线程的情况下实例化对象操纵的原子性
                if(lazybonesMode == null) {
                    lazybonesMode = new LazybonesMode();
                }
            }
        }
        return lazybonesMode;
    }
   /* 使用 private 修饰构造方法,所以就会造成对象无法实例化成功*/
    private LazybonesMode() { };
}
class Test2 {
    public static void main(String[] args) {
        LazybonesMode lazybonesMode1 = LazybonesMode.getLazybonesMode();
        LazybonesMode lazybonesMode2 = LazybonesMode.getLazybonesMode();
        System.out.println(lazybonesMode1 == lazybonesMode2);
    }
}

image.gif

image.gif编辑

image.gif编辑


到这里,Java 单例模式,博主已经分享完了,浅浅的了解一下,希望对大家有所帮助,如有不妥之处欢迎批评指正。

image.gif编辑

本期收录于博主的专栏——JavaEE,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“JavaEE基础知识”。

下期预告:Java 线程池

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

相关文章
|
5天前
|
设计模式 缓存 安全
java中的设计模式&单例模式
java中的设计模式&单例模式
|
3天前
|
设计模式 Java 机器人
探索Java中的设计模式:从单例到工厂模式
探索Java中的设计模式:从单例到工厂模式
|
3天前
|
设计模式 Java
设计模式-单例模式(JAVA)
设计模式-单例模式(JAVA)
4 0
|
1月前
|
设计模式 SQL 安全
Java一分钟之-设计模式:单例模式的实现
【5月更文挑战第16天】本文介绍了单例模式的四种实现方式:饿汉式(静态初始化)、懒汉式(双检锁)、静态内部类和枚举单例,以及相关问题和解决方法。关注线程安全、反射攻击、序列化、生命周期和测试性,选择合适的实现方式以确保代码质量。了解单例模式的优缺点,谨慎使用,提升设计效率。
36 3
|
1月前
|
设计模式 存储 安全
Java 设计模式:深入单例模式的理解与应用
【4月更文挑战第27天】单例模式是一种常用的设计模式,在 Java 开发中扮演着重要角色。此模式的主要目的是保证一个类只有一个实例,并提供一个全局访问点。
41 0
|
1月前
|
设计模式 安全 Java
【JavaEE】多线程案例-单例模式
【JavaEE】多线程案例-单例模式
|
7月前
|
设计模式 缓存 安全
Java23种设计模式之【单例模式】
Java23种设计模式之【单例模式】
|
10月前
|
设计模式 安全 Java
《Java极简设计模式》第01章:单例模式(Singleton)
介绍创建Java单例对象的七种方式,重点掌握哪些创建方式是线程安全的,哪些方式是线程不安全的,并能够在实际项目中灵活运用设计模式,编写可维护的代码。
143 2
|
10月前
|
设计模式 数据库
java23种设计模式(1)-单例模式
java23种设计模式(1)-单例模式
59 0
|
11月前
|
设计模式 Java Spring
java spring设计模式 之 工厂模式
java spring设计模式 之 工厂模式