欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单例模式

程序员文章站 2022-06-03 14:59:31
...
1、写出单例模式的实现,至少两种

当一个类的实例可以有且只可以一个的时候就需要用到了。为什么只需要有一个呢?有人说是为了节约内存,但这只是单例模式带来的一个好处。只有一个实例确实减少内存占用,可是我认为这不是使用单例模式的理由。我认为使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

一般Singleton模式通常有三种形式:

第一种形式:懒汉式,也是常用的形式。

public class SingletonClass{
    private static SingletonClass instance=null;
    public static synchronized SingletonClass getInstance()
    {
        if(instance==null)
        {
		//在第一次调用的时候创建对象
               instance=new SingletonClass();
        }
        return instance;
    }
	//构造方法
    private SingletonClass(){
    }
}


第二种形式:饿汉式

public class SingletonClass{
    private static SingletonClass instance=null;
    public static synchronized SingletonClass getInstance()
    {
        if(instance==null)
        {
		//在第一次调用的时候创建对象
               instance=new SingletonClass();
        }
        return instance;
    }
	//构造方法
    private SingletonClass(){
    }
}


第三种形式: 双重锁的形式。

public class Singleton{
    private static Singleton instance=null;
    private Singleton(){
        //do something
    }
    public static Singleton getInstance(){
        if(instance==null){
            synchronized(Singleton.class){
                if(instance==null){
              	  instance=new Singleton();
                }
            }
        }
        return instance;
    }
}


2、饿汉模式也在单例设计中广泛的被应用。例如,Hibernate默认的单例,获取sessionFactory用的HibernateUtil类建立方式如下:

public class HibernateUtil {
    private static final SessionFactory ourSessionFactory;

    static {
        try {
            Configuration configuration = new Configuration();
            configuration.configure();
            ourSessionFactory = configuration.buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        return ourSessionFactory.openSession();
    }
}