设计模式之单例模式
设计模式之单例模式
作者: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;
}
}