【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 线程池

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

相关文章
|
7月前
|
设计模式 安全 Java
【JavaEE】多线程案例-单例模式
【JavaEE】多线程案例-单例模式
|
设计模式 Java Spring
Spring框架中使用了那些设计模式
Spring框架中使用了那些设计模式
37 0
|
设计模式 Java Spring
java spring设计模式 之 工厂模式
java spring设计模式 之 工厂模式
|
设计模式 安全 Java
|
设计模式 SQL 算法
一文让你彻底了解Spring框架中用到了哪些设计模式
一文让你彻底了解Spring框架中用到了哪些设计模式
一文让你彻底了解Spring框架中用到了哪些设计模式
|
安全 Java 自动驾驶
java面试题:在SpringAOP中,关注点和横切关注的区别是什么?
java面试题:在SpringAOP中,关注点和横切关注的区别是什么?
1260 0
java面试题:在SpringAOP中,关注点和横切关注的区别是什么?
|
设计模式 前端开发 算法
【JavaWeb】讲解:JSTL标签以及MVC设计模式
本期主要介绍讲解:JSTL标签以及MVC设计模式
129 0
【JavaWeb】讲解:JSTL标签以及MVC设计模式
|
设计模式 Java Spring
Spring框架中用到了那些设计模式????
Spring框架中用到了那些设计模式????
110 0
|
设计模式 安全 Java
设计模式系列之组合模式及其在JDK和MyBatis源码中的运用详解
设计模式系列之组合模式及其在JDK和MyBatis源码中的运用详解
设计模式系列之组合模式及其在JDK和MyBatis源码中的运用详解
|
设计模式 Java
Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)(四)
Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)(四)
102 0
Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)(四)

热门文章

最新文章