设计模式(五)—— 单例模式

一、含义

在一个系统中,确保一个类只有一个实例,并提供一个全局访问点,这个类在系统中是独一无二的。

二、要点

1.单例模式确保程序中最多只有一个这个类的实例。

2.在java中实现单例模式需要把构造器私有化,并提供一个静态方法和静态变量。

三、分析单例模式

首先来看一下最经典的单例模式的代码如下:

public class Singleton {

    //利用一个静态变量来保存Singleton类的唯一实例
    private static Singleton instance;
    
    
    //将构造器私有化
    private Singleton() {

    }
    
    //使用这个方法来实例对象,并对外提供访问
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

上诉方法,就是单例模式的懒汉式,也就是说当没有外部方法调用这个类的getInstance()方法事,这个类事不会被实例化的,只有在调用这个方法后,这个类才会被实例化。

上诉单例模式,在多线程中可能会实例化类,因为在多线程中,可能会有多个线程进入if条件的判断,这个时候,就会实例化多个对象,解决这个问题,就是需要将这个方法进行同步处理,每次最多只能有一个线程进入,修改后的代码如下:

  //使用这个方法来实例对象,并对外提供访问,加上synchronized,进行同步处理
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

但是将整个方法进行同步之后,那么带来的问题就是会影响程序的性能,因为单例模式是进行一次实例化的操作,所以只是在第一次调用的时候,需要进入if的条件,一旦实例化后,就不会在进入if的判断条件,那么就可以使用单例模式的另一种写法,就是饿汉式,就是不管这个对象有没有在程序其它地方调用,上来就直接实例化这个类。

public class Singleton {

    //利用一个静态变量来保存Singleton类的唯一实例
    private static Singleton instance = new Singleton();


    //将构造器私有化
    private Singleton() {

    }

    //使用这个方法来实例对象,并对外提供访问
    public static synchronized Singleton getInstance() {
        
        return instance;
    }
}

还有一个方式就是,我们只需在这个对象第一次进行创建的时候进行同步,保证对象只被创建一次即可,当对象创建后,就不需要再进行同步,那么我们就可以把同步的范围进行缩小。

public class Singleton {

    //利用一个静态变量来保存Singleton类的唯一实例
    private volatile static Singleton instance;


    //将构造器私有化
    private Singleton() {

    }

    //使用这个方法来实例对象,并对外提供访问
    public static  Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

文章内容参考《Head First 设计模式》

猜你喜欢

转载自blog.csdn.net/huxiaodong1994/article/details/84260886
今日推荐