单例模式简要定义:单例模式确保一个类只有一个实例,并提供一个全局访问点

1. 如何保证一个类只有一个实例,且这个实例易于被访问?

lazy evaluation:在用到的时候才创建对象。

  • 全局变量:
    • 使得一个对象可以被访问,全局访问点;
    • 但不能防止实例化多个对象;
    • 如果将对象赋值给一个全局变量,那么必须在程序一开始就创建好对象。但是,如果这个对象非常耗费资源,而程序在执行的过程中又一直没有用到它;造成浪费;
  • 单件模式(singleton)提供了一个全局的访问点,像全局变量一样方便,又没有全局变量的缺点(单件类可以延迟实例化);

2. Java 经典实现


public class Singleton {
    public static synchronized Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
    private Singleton() {}
    private static Singleton uniqueInstance; 
}
  • 在多线程环境下,有可能在一个线程进入 if 判断之后,还未创建赋值对象之前,又有新的线程进入 if 判断,这样就无法保证对象的唯一性;
  • 增加 synchronized 关键字到 getInstance 方法,这样使得在每个线程进入该方法之前,要先等候别的线程离开该方法,也就是说,不会有两个线程可以同时进入被 synchronized 修饰的方法;

3. 一些特殊需求的单例实现

  • 允许多次 new 创建实例,但每次 new 出来的对象都是同一个对象。

    只需将 getInstance()的实现放进构造函数即可:

    public class Singleton {
        public Singleton() {
            if (self) return;
            self = this;
        }
        private static Singleton self;
    }
posted on 2017-08-02 12:09  未雨愁眸  阅读(116)  评论(0编辑  收藏  举报