单例(singleton)模式

来源:互联网 发布:java编程技巧 编辑:程序博客网 时间:2024/06/14 04:03

1.意图

确保一个类只有一个实例,并提供一个全局访问点。

2.解释

  • 确保只创建一个特定类的一个对象。
  • 在软件工程中,单例模式是将类的实例化限制为一个对象的软件设计模式。当需要一个对象来协调整个系统的动作时,这是非常有用的。

3.使用场景

  • 必须只有一个类的一个实例,并且必须可以从一个众所周知的接入点访问客户端。
  • 当唯一的实例应该通过子类化可扩展,并且客户端应该能够使用扩展实例而不修改它们的代码。

4.单例的几种形式

1.饿汉模式
public class IvoryTower {    private IvoryTower() {    }    private static final IvoryTower INSTANCE = new IvoryTower();    public static IvoryTower getInstance() {        return INSTANCE;    }}
2.懒汉模式
public class InitializingOnDemandHolderIdiom {    private InitializingOnDemandHolderIdiom() {    }    public static InitializingOnDemandHolderIdiom getInstance() {        return HelperHolder.INSTANCE;    }    private static class HelperHolder {        private static final InitializingOnDemandHolderIdiom INSTANCE = new InitializingOnDemandHolderIdiom();    }}

3.懒汉模式(线程安全)

public class ThreadSafeLazyLoadedIvoryTower {    private static ThreadSafeLazyLoadedIvoryTower instance;    private ThreadSafeLazyLoadedIvoryTower() {        if (instance != null) {            throw new IllegalStateException("Already initialized.");        }    }    public static ThreadSafeLazyLoadedIvoryTower getInstance() {        if (instance == null) {            instance = new ThreadSafeLazyLoadedIvoryTower();        }        return instance;    }}

4.懒汉模式(线程安全双检测)

public class ThreadSafeDoubleCheckLocking {    private static volatile ThreadSafeDoubleCheckLocking instance;    private ThreadSafeDoubleCheckLocking() {        if (instance != null) {            throw new IllegalStateException("Already initialized.");        }    }    public static ThreadSafeDoubleCheckLocking getInstance() {        ThreadSafeDoubleCheckLocking result = instance;        if (result == null) {            synchronized (ThreadSafeDoubleCheckLocking.class) {                result = instance;                if (result == null) {                    instance = result = new ThreadSafeDoubleCheckLocking();                }            }        }        return result;    }}
参考教程:https://github.com/iluwatar/java-design-patterns/tree/master/singleton
原创粉丝点击