编辑
哈喽,大家好~我是保护小周ღ,本期为大家带来的是 Java 设计模式中的单例模式,采用两种方式来实现——“饿汉”模式 和 “懒汉” 模式 。确定不来看看嘛~更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘
编辑
一、设计模式
什么是设计模式,通俗易懂的讲:在我们软件开发中会遇到许多常见的“问题场景”,针对这些问题每个人都有自己程序设计方法,代码质量各有千秋,为了在某些场景下的代码结构,大佬就总结出一些固定的套路来应对这些场景,那么按照大佬的代码套路,开发效率就是杠杠的,也不会出错,大佬总结的套路这个就看作是设计模式。
单例模式能够保证某个类在程序中只存在 “唯一” 一份实例,而不会创建出多个实例对象。
根据具体需求来分析是否使用该设计模式
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)); } }
编辑
该设计模式是多线程安全的。
造成多线程不安全的因素:
不会出现多线程同时对一块内存数据修改的情况,该类只利用方法返回一个实例化对象的引用。
该代码也不会存在内存可见性问题。
三、“懒汉” 实现单例
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); } }
编辑
编辑
到这里,Java 单例模式,博主已经分享完了,浅浅的了解一下,希望对大家有所帮助,如有不妥之处欢迎批评指正。
编辑
本期收录于博主的专栏——JavaEE,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“JavaEE基础知识”。
下期预告:Java 线程池
感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘