设计模式之单例模式

发布日期:2019-06-03

设计模式之单例模式

作者:SimpleWu

为什么要使用单例模式?

​ 古代的皇帝有且只能有一个,如果有多个皇帝会怎么样,那么就会出问题。所以有些对象有且只能有一个的,多了就会出问题,一山难容二虎。这个时候就有了我们的单例模式。

什么是单例模式?

在系统中,有些对象比如:配置文件,工具类,线程池,日志对象等。我们只需要一个就够了,多了就不便于管理。

有些对象,我们需要确保在一个程序中有且只能有一个,那么我们就需要单例模式。

单例模式分为两种:饿汉式,懒汉式

懒汉式

从线程安全性上讲,不加同步的懒汉式是线程不安全的,比如,有两个线程,一个是线程A,一个是线程B,它们同时调用getInstance方法,那就可能导致并发问题。

懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。

/** * 设计模式-单例模式-懒汉式 * @作者:SimpleWu * 2018年10月26日 下午10:54:02 */public class Lazy { //私有化构造函数,不允许程序员手动再new对象 private Lazy(){} private static Lazy lazy; public static Lazy getInstance(){ //当外部调用这个方法的时候判断,如果这个变量为null则给他创建个对象 //否则直接返回类中的lazy if(lazy == null){ lazy = new Lazy(); } return lazy; }}

饿汉式

在类被加载时,自动会创建单例实例对象。不管用户是否会去调用该成员。

饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间。

饿汉式是线程安全的,因为虚拟机保证只会装载一次,在装载类的时候是不会发生并发的。

/** * 设计模式-单例模式-饿汉式 * @作者:SimpleWu * 2018年10月26日 下午11:13:19 */public class Hungry { private Hungry(){}; //在类装置器中就已经创建好了 private static Hungry hungry = new Hungry(); public static Hungry getInstance(){ return hungry; }}