单例模式
所谓类的单例模式,就是采取一定办法,保证对整个软件系统中,某个类只能存在一个对象实例。 单例模式主要分为懒汉式和饿汉式
单例模式是指当需要某个类的实例化的对象时直接通过类·get方法得到已经实例化的对象 具体实例化的过程在类内部完成,其核心思想是:
在类内部将构造器私有化,使得实例化只能在类内部完成,先创建静态型属性,并给出一个public类型的静态的get方法返回实例化的对象
根据实例化的先后顺序分为懒汉式和饿汉式,
懒汉式是在先不调用构造器创建对象,在需要实例时再创建;饿汉式是在最开始就创建出实例化的对象,然后直接等待被调用
饿汉式
- 1:先将实例创建起来,无论是否需要此实例,先创建出来等待被调用(一定要用static修饰)
- 2:将构造器私有化,防止其他类在外面创建
- 3:将实例化的对象返回,(一定要用static修饰)
- 代码示例:
class Singleton1 {
//饿汉式
//1:先将实例创建起来,无论是否需要此实例,先创建出来等待被调用(一定要用static修饰)
public static Singleton1 instance=new Singleton1();
//2:将构造器私有化,防止其他类在外面创建
private Singleton1() {
}
//3:将实例化的对象返回,(一定要用static修饰)
public static Singleton1 getInstance() {
return instance;
}
}
懒汉式 —线程不安全
- 1:创建一个Singleton2类型的空变量(未实例化),(一定要用static修饰)
- 2:将构造器私有化,防止其他类在外面创建
- 3:需要实例时,判断当前对象是否已经被实例化,若为被实例化则先实例化最开始创建的变量,再返回对象;若已经实例化则直接返回对象,此优点是只有在需要实例时才会创建实例,不需要实例时只有一个null值的instance属性
代码示例:
class Singleton2{
//懒汉式 ---线程不安全
//1:创建一个Singleton2类型的空变量(未实例化),(一定要用static修饰)
public static Singleton2 instance=null;
//2:将构造器私有化,防止其他类在外面创建
private Singleton2(){
}
//3:需要实例时,判断当前对象是否已经被实例化,若为被实例化则先实例化最开始创建的变量,再返回对象;
// 若已经实例化则直接返回对象,此优点是只有在需要实例时才会创建实例,不需要实例时只有一个null值的instance属性
public static Singleton2 getInstance() {
if (instance==null){
instance=new Singleton2();
}
return instance;
}
}
懒汉式 —线程安全
- 1:创建一个Singleton2类型的空变量(未实例化),(一定要用static修饰)
- 2:将构造器私有化,防止其他类在外面创建
- 3:需要实例时,判断当前对象是否已经被实例化,若为被实例化则先实例化最开始创建的变量,再返回对象;若已经实例化则直接返回对象,此优点是只有在需要实例时才会创建实例,不需要实例时只有一个null值的instance属性;加锁
synchronized 才能保证单例线程安全
class Singleton3 {
//1:创建一个Singleton2类型的空变量(未实例化),(一定要用static修饰)
private static Singleton3 instance=null;
//2:将构造器私有化,防止其他类在外面创建
private Singleton3 (){
}
//3:需要实例时,判断当前对象是否已经被实例化,若为被实例化则先实例化最开始创建的变量,再返回对象;
// 若已经实例化则直接返回对象,此优点是只有在需要实例时才会创建实例,不需要实例时只有一个null值的instance属性
// 加锁 synchronized 才能保证单例线程安全
public static synchronized Singleton3 getInstance() {
if (instance == null) {
instance = new Singleton3();
}
return instance;
}
}
**
饿汉式和懒汉式的优缺点
**
- 饿汉式:
优点:饿汉式是线程安全的
缺点:对象加载时间过长,从类开始到类结束时一直存在
- 懒汉式:
优点:延迟对象的创建
缺点:可能线程不安全