浅谈单例模式的四种写法
2019-03-06 22:37
78 查看
单例模式
定义:
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
目的:
保证一个类只有一个实例
怎么实现?
* 内部保证实例唯一 * 限制外部的访问方式 * 不可以被外部创建
单例模式的四种写法
- 懒汉式单例实现
public class SLazy { private static SLazy instance; private SLazy() { System.out.println("懒汉模式单例创建成功!"); } public static SLazy getInstance() { if (instance==null) { instance = new SLazy(); } return instance; } }
需要时可以直接创建单例,但是线程不安全,在多线程情况下,考虑极端情况,也许会同时创建两个实例。
- 饿汉式单例实现
public class SHungry { private static SHungry instance = new SHungry(); private SHungry() { System.out.println("饿汉模式单例创建成功!"); } public static SHungry getInstance() { return instance; } }
这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。 在类装载的时候就完成实例化,如果从始至终从未使用过这个实例,则会造成内存的浪费。
- Double Check Lock(DCL)-单例实现
public class SDCL { private static SDCL instance; private SDCL() { System.out.println("SDCL单例创建成功!"); } public static SDCL getInstance() { if (instance==null) { synchronized (SDCL.class) { if (instance==null) { instance = new SDCL(); } } } return instance; } }
进行了两次if (singleton == null)检查,保证线程安全。 这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。
- Enum-单例实现
public enum Senum { INSTANCE; public void say(String s) { } }
枚举的创建由JVM虚拟机保证,避免了多线程同步的问题。
- 给一个Test类看结果:
public static void main(String[] args) { // TODO Auto-generated method stub SLazy.getInstance(); SHungry.getInstance(); SDCL.getInstance(); Senum s1 = Senum.INSTANCE; System.out.println(s1); }
运行结果: 懒汉模式单例创建成功! 饿汉模式单例创建成功! SDCL单例创建成功! INSTANCE
适用的场景
举个例子,我们打开Windows的回收站时,你只能打开一个,当你想开第二个回收站窗口时,系统并不允许。 除此之外,有时你需要频繁打开关闭回收站进行操作 上述场景,就是单例模式的应用,可以以此类推。
相关文章推荐
- 浅谈vim的四种模式及模式切换
- 浅谈Android四种启动模式及应用场景--standrad、singleTop、singleTask、singleInstance
- 设计模式拾荒之单例模式( Single Pattern ): 不仅仅是回字的四种写法
- 浅谈android Activity 四种模式
- Java语言中单例模式的四种写法
- Java语言中单例模式的四种写法
- 浅谈MVP与Model-View-ViewModel(MVVM)设计模式
- Activity的四种启动模式
- Activity的四种加载模式
- Android onClick 按钮单击事件 四种常用写法
- VirtualBox的四种网络接入模式
- 设计模式:单例模式的写法(基础写法和线程安全写法)
- 区分Activity的四种加载模式
- 设计模式:单例模式7种写法
- 两种单例模式的写法
- es6的四种声明变量的写法
- Android:lunchmode(Activity的四种启动模式介绍)
- 单例模式的写法
- Activity的四种启动模式简介
- Java中Dao模式中两种Dao的数据库操作(BaseDao的写法)