引入
在之前的文章中我们介绍了常见的设计模式,今天我们来使用 Java 语言对单例模式进行具体实现举例。
实例
在下面的例子中,我们使用单例模式来保证每次生成的对象都是唯一的。
统一接口
1 2 3 4 5 6 7
|
interface SingletonObject{}
|
饿汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
class Hungry implements SingletonObject{
private static Hungry instance = new Hungry();
private Hungry() {}
public static Hungry getInstanceByHungry() { return instance; } }
|
懒汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
class LazyBones implements SingletonObject{
private static LazyBones instance;
private LazyBones() {}
public synchronized static LazyBones getInstanceByLazyBones() { if (instance == null) { instance = new LazyBones(); }
return instance; } }
|
双重锁检测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
class DCL implements SingletonObject {
private static DCL instance;
private DCL() {}
public synchronized static DCL getInstanceByDCL() { if (instance == null) { synchronized (DCL.class) { if (instance == null) { instance = new DCL(); } } }
return instance; } }
|
静态内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
class StaticInnerClass implements SingletonObject {
private StaticInnerClass() { }
public static StaticInnerClass getInstanceByStaticInnerClass() { return InnerClass.INSTANCE; }
static class InnerClass{
private static final StaticInnerClass INSTANCE = new StaticInnerClass(); } }
|
枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
enum Enum implements SingletonObject{
INSTANCE;
public static Enum getInstanceByEnum() { return INSTANCE; } }
|
测试结果
笔者在进行测试时将上面的所有接口及类以及下面的测试类写在一个java文件中,测试结果在不同电脑不同时间上可能有所不同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public static void main(String[] args) { Object o1 = new Object(); Object o2 = new Object(); printInfo("普通创建", o1, o2);
SingletonObject s1 = Hungry.getInstanceByHungry(); SingletonObject s2 = Hungry.getInstanceByHungry(); printInfo("饿汉式", s1, s2);
s1 = LazyBones.getInstanceByLazyBones(); s2 = LazyBones.getInstanceByLazyBones(); printInfo("懒汉式", s1, s2);
s1 = DCL.getInstanceByDCL(); s2 = DCL.getInstanceByDCL(); printInfo("双重锁检测", s1, s2);
s1 = StaticInnerClass.getInstanceByStaticInnerClass(); s2 = StaticInnerClass.getInstanceByStaticInnerClass(); printInfo("静态内部类", s1, s2);
s1 = Enum.getInstanceByEnum(); s2 = Enum.getInstanceByEnum(); printInfo("枚举类", s1, s2); }
public static void printInfo(String way, Object s1, Object s2) { System.out.println(way + ": "); System.out.println("s1 = " + s1); System.out.println("s2 = " + s2); System.out.println(); }
|
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 普通创建: s1 = java.lang.Object@404b9385 s2 = java.lang.Object@6d311334
饿汉式: s1 = designPattern.Hungry@682a0b20 s2 = designPattern.Hungry@682a0b20
懒汉式: s1 = designPattern.LazyBones@3d075dc0 s2 = designPattern.LazyBones@3d075dc0
双重锁检测: s1 = designPattern.DCL@214c265e s2 = designPattern.DCL@214c265e
静态内部类: s1 = designPattern.StaticInnerClass@448139f0 s2 = designPattern.StaticInnerClass@448139f0
枚举类: s1 = INSTANCE s2 = INSTANCE
|