单例模式(Singleton) 对应的慕课视频:https://www.imooc.com/video/1772
单例设计模式用于保证一个类只有一个实例
他有两种表现形式:懒汉式,饿汉式
饿汉式和懒汉式最明显的区别就是两者对象实例化的时间不相同。
恶汉式是在类加载的时候就创建,懒汉式是在调用实例的时候在加载。
下面来看一下饿汉式的基本代码
package songyan.demo;
//单例模式:保证一个类的实例只有一个
/**
* 单例设计模式-饿汉式
* @author Administrator
*
*/
public class singleton {
//隐藏构造函数
private singleton(){
}
//创建该类的对象
private static singleton instance = new singleton();
//提供反复问内部实例的方法
public static singleton getInstance()
{
return instance;
}
}
饿汉式编写顺序:
隐藏构造函数(将构造函数私有化,防止在类的外部创建对象)
创建该类的对象(private static)
对外提供访问这个对象的方法
懒汉式的实现
package test; /** * author:songyan * date: 2019/11/10 **/ public class SingletonDemo2 { private static SingletonDemo2 singletonDemo2 = null; public SingletonDemo2 getInstance(){ if(singletonDemo2==null) singletonDemo2 = new SingletonDemo2(); return singletonDemo2; } private SingletonDemo2(){} }
懒汉式的编写顺序与饿汉式相同,不同的是对象实例化的时间,在懒汉式中,是在访问该对象的时候将对象实例化的。
再来比较一下两种实现方式
1,饿汉式在加载类的时候比较慢,但是在运行的时候比较快。(懒汉式相反)
2,饿汉式是线程安全的,而懒汉式是线程安全的
懒汉式的线程安全是可以解决的,可以通过同步代码块或者同步函数来实现,同步代码块要比同步函数更优一些(同步函数的范围太大,同步了不必要的部分,可以使用同步函数仅同步局部即可)
当然使用同步的方式解决多线程的安全问题也是有弊端的,他会降低程序执行的效率,所以在开发过程中更多的是使用饿汉式的实现方式
线程安全的懒汉式
package test; /** * author:songyan * date: 2019/11/10 **/ public class SingletonDemo2 { private static SingletonDemo2 singletonDemo2 = null; public SingletonDemo2 getInstance(){ synchronized (this){ if(singletonDemo2==null) singletonDemo2 = new SingletonDemo2(); return singletonDemo2; } } private SingletonDemo2(){} }