您的位置:首页 > 其它

浅谈单例模式的四种写法

2019-03-06 22:37 78 查看

单例模式

定义:

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。

目的:

保证一个类只有一个实例

怎么实现?

* 内部保证实例唯一
* 限制外部的访问方式
* 不可以被外部创建

单例模式的四种写法

  1. 懒汉式单例实现
public class SLazy {
private static SLazy instance;

private SLazy() {
System.out.println("懒汉模式单例创建成功!");
}

public static SLazy getInstance() {
if (instance==null) {
instance = new SLazy();
}
return instance;
}
}
需要时可以直接创建单例,但是线程不安全,在多线程情况下,考虑极端情况,也许会同时创建两个实例。
  1. 饿汉式单例实现
public class SHungry {
private static SHungry instance = new SHungry();

private SHungry() {
System.out.println("饿汉模式单例创建成功!");
}

public static SHungry getInstance() {
return instance;
}
}
这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
在类装载的时候就完成实例化,如果从始至终从未使用过这个实例,则会造成内存的浪费。
  1. 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实例化对象。
  1. Enum-单例实现
public enum Senum {
INSTANCE;

public void say(String s) {

}
}
枚举的创建由JVM虚拟机保证,避免了多线程同步的问题。
  1. 给一个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的回收站时,你只能打开一个,当你想开第二个回收站窗口时,系统并不允许。
除此之外,有时你需要频繁打开关闭回收站进行操作
上述场景,就是单例模式的应用,可以以此类推。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: