设计模式之单例模式

作者: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;
    }
}

版权声明:本文为SimpleWu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/SimpleWu/p/9859269.html