类型:创建模式
定义:
单例模式负责创建一个对象,并且要保证只创建了一个对象。这个类提供了一种方法来访问它的唯一对象,可以直接访问,而不需要实例化类的对象。
一、特点:
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供对这一实例访问和操作方法。
二、应用场景:
在项目中,有些对象我们只需要一个,比如配置文件、工具类、线程池、日志对象等,如果使用多个对象会导致系统资源浪费等问题,这时候,就可以使用单例模式设计程序,系统中的单例类最多只能被创建一个实例。
三、实现方法:
常用的单例模式有懒汉模式和饿汉模式等。
首先,想要保证单例类只能创建一个实例,就要保证外界对象不能访问到该类的构造器,所以需要私有化构造函数。
1.饿汉模式
/**
* 饿汉单例模式
* 在加载类文件的时候,对象就被创建,所以称为饿汉单例
* 特点:加载类时较慢,但是运行时获取对象会比较快,且是线程安全的
*/
public class EagerlySingleton {
//1.构造函数私有化,防止外界直接创建对象,不考虑反射机制
private EagerlySingleton() {
}
//2.自己创建实例,静态属性,在加载class文件时创建对象
private static EagerlySingleton singleton = new EagerlySingleton();
//3.提供一个用户获取实例的方法
public static EagerlySingleton getInstance() {
return singleton;
}
}
2.懒汉模式
/**
* 懒汉单例模式
* 特别:加载类时较快,但是运行时获取对象时会慢,线程不安全
*/
public class LazySingleton {
// 1.构造函数私有化,防止外界直接创建对象
private LazySingleton() {
}
// 2.自己创建实例,静态属性,在加载class文件时创建对象
private static LazySingleton singleton;
// 3.提供一个用户获取实例的方法
public static LazySingleton getInstance() {
if(singleton==null) {
singleton=new LazySingleton();
}
return singleton;
}
//通过在方法加synchronized关键字保证线程安全,但是影响性能
public static synchronized LazySingleton getInstance1() {
if(singleton==null) {
singleton=new LazySingleton();
}
return singleton;
}
//双重检查锁定
public static LazySingleton getInstance2() {
if(singleton==null) {
synchronized (LazySingleton.class) {
if(singleton==null)
singleton=new LazySingleton();
}
}
return singleton;
}
}