设计模式之单例模式

2017-06-04  本文已影响26人  老羊_肖恩

单例模式的定义

Ensure a class has only one instance, and provide a global point of access to it. 即确保某各类只有一个实例,并且提供一个全局的入口。
通用类图如下:

Singleton.jpg

Singleton类称为单例类,通过使用私有构造方法确保在系统中只产生一个实例。按照实例初始化的时间,单例模式可以分成两类:饿汉式单例模式和懒汉式单例模式。顾名思义:恶汉式单例模式是在类加载时便完成单例实例的创建,而懒汉式单例模式是在使用时,才进行单例实例的创建。代码分别如下:

public class Singleton {
    private static final Singleton singleton = new Singleton();

    //私有构造方法
    private Singleton(){
    }

    //获取实例对象方法
    public static Singleton getSingleton(){
        return singleton;
    }

    //其他方法,尽量是static
    public static void doSomething(){   
    }
}
public class Singleton {
    
    private static Singleton singleton = null;
    
    //私有构造方法
    private Singleton(){
    }
    
    //获取实例对象方法
    public static Singleton getSingleton(){
        if(singleton == null){
            //考虑高并发情况
            synchronized (Singleton.class) {
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
    
    //其他方法,尽量是static
    public static void doSomething(){
        
    }
}

饿汉式单例模式和懒汉式单例模式均有各自的试用场景,只是懒汉式单例模式在第一次创建单例实例时,需考虑在高并发场景下可能会在内存中创建多个实例的情况。两种实现方式可以根据需要自行选择,推荐试用恶汉式单例模式。

单例模式的应用

  1. 单例模式的有点
  1. 单例模式的缺点
  1. 单例模式使用场景
  1. 单例模式的注意事项

最佳实践

单例模式是23中设计模式中比较简单的设计模式,应用也十分广泛。在Spring中,每个Bean默认都是单例的,这样做的优点是Spring的Bean容器可以管理这些Bean的生命周期。如果采用非单例模式(Prototype), 则Bean初始化之后交由J2EE容器管理,Spring容器不在跟踪管理这些Bean的生命周期。

《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。

上一篇 下一篇

猜你喜欢

热点阅读