简单理解设计模式之一单例模式

什么是设计模式

简单点讲,设计模式就相当于一种模板,这个模板里规定了一些具体流程。

单例模式

单例的意思就是唯一,一个的意思。在java代码中单例指的是对象唯一的意思,这个对象只能被创建一次。那一般哪些类的对象我们只需要一个呢?如配置类,工具类,线程池,缓存,日志对象等,一般我们在整个web应用中只需要一个对象。但是我们又要在多个类中去使用它,一般方法我们都是再new它一个对象,为什么这些类的对象只要一个呢,答案也很简单,避免占用过多的资源,多个实例也可能会导致数据结果不一致等问题。那如何保证这些类的对象只有一个呢?那就要通过下面介绍的饿汉模式和懒汉模式。

饿汉模式

所谓饿汉模式就是老子我现在很饿,我先吃了。那这饿和吃在java代码中又是代表着什么?我先创建一个饿汉模式的简单单例,代码如下

package com.test;

/**
 * 这表示是一个单例模式的类(如配置类等)
 */
public class Singleton {
    //创建一个饿汉单例模式1,将构造方法私有化
    private Singleton(){//当构造方法私有化后,该构造方法只能被自己类调用,其他类不能new该的对象(带参数的不讨论)

    }
    //2,创建类的唯一实例,该实例也需要私有化
    private static Singleton instance=new Singleton();
    //3,提供一个给其他类获取实例的方法
    public static Singleton getInstance(){
        return instance;//谁调用了该方法就返回这个类的对象给它
    }
}

由于 private static Singleton instance=new Singleton();是static静态方法的,当这个Singleton 类加载的使用,无论有没有其他类方法调用getInstance()方法,它都会去创建这个类的实例。意思就是我饿了,不管有没有人来我都要先吃。饿其实代表着一种状态,该类目前有没有被实例化,吃,代表着实例化这一动作。

懒汉模式

懒汉模式也很简单,它的意思就是我超懒,如果没有人来,我就连饭都懒得吃了。懒汉模式的代码如下:

package com.test;

/**
 * 这表示是一个单例模式的类(如配置类等)
 */
public class Singleton {//实现方式与饿汉相似
    //创建一个懒汉单例模式1,将构造方法私有化
    private Singleton(){//当构造方法私有化后,该构造方法只能被自己类调用,其他类不能new该的对象(带参数的不讨论)

    }
    //2,与饿汉模式不同的地方,这里只是去声明这个类的实例,没有进行实例化
    private static Singleton instance;
    //3,提供一个给其他类获取实例的方法
    public static Singleton getInstance(){
        if(instance==null){//如果该类是第一被调用,则该实例的内容是空的,需要对它进行实例化
            instance=new Singleton();
        }
        return instance;//谁调用了该方法就返回这个类的对象给它
    }

与饿汉模式不同的地方,这里只是去声明这个类的实例,没有进行实例化, private static Singleton instance;所以当类加载的时候它也不会进行实例化,只有当外部类调用getInstance()方法时才会进行类的实例化。意思就是有人送饭过来了,我才吃,不然我就不吃。当然这两个模式都只是吃一次就永远饱了,这样才是单例唯一。

饿汉与懒汉模式的区别

饿汉模式在类上的加载比较慢,为什么?原因也很好理解,因为饿汉的类在加载时同时要实例化类的对象,而懒汉模式则在类加载时不用实例化类的对象。
饿汉模式在运行时获取类饿汉的对象速度比较快,原因也很简单,获取懒汉模式的对象时候需要花时间去实例化类的对象。
但是考虑在使用饿汉模式还是懒汉模式的时候,最多的是要考虑它是否是线程安全的。饿汉模式在线程上是安全,但懒汉模式在线程上是不安全的。

由于是第一次写博客,上述有什么不正确或不对的地方,欢迎指出一起谈论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值