🍋单例模式
单例模式是Java中最简单的设计模式之一,属于创建型模式,它提供一种创建对象的最佳方式。
单例模式顾名思义就是单一的实例,涉及到一个单一的类,该类负责创建自己的对象,同时确保只有一个对象被创建,并且提供一种可以访问这个对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式的特点:
1.单例类只能有一个实例
2.这个实例必须由单例类自己创建
3.单例类需要提供给外界访问这个实例
单例模式的作用:
单例模式主要为了保证在Java应用程序中,一个类只有一个实例存在。
🍉1.单例模式的结构
单例模式主要有以下角色:
- 单例类
只能创建一个实例的类
- 访问类
测试类,就是使用单例类的类
🍉2.单例模式的实现
🍊2.1饿汉式
饿汉式:类加载时创建该单实例类对象
🌰1.饿汉式-方式1 静态成员变量
创建 饿汉式静态成员变量 单例类
public class Demo1 {
/**
*私有构造方法 让外界不能创建该类对象
*/
private Demo1(){
}
/**
* 在类中创建该本类对象 static是由于外界获取该类对象的方法getInstance()是 static
* 这个对象instance就是静态成员变量
*/
private static Demo1 instance = new Demo1();
/**
* 提供一个公共的访问方式,让外界可以获取该类的对象 static是因为外界不需要创建对象,直接通过类访问
*/
public static Demo1 getInstance(){
return instance;
}
}
创建 饿汉式静态成员变量 测试类(访问类)
public class Test1 {
public static void main(String[] args) {
//创建demo1类的对象 这个时候就无法通过new创建了,因为demo1的构造方法是私有的
Demo1 instance = Demo1.getInstance();
Demo1 instance1 = Demo1.getInstance();
//判断两个对象是否是同一个
System.out.println(instance == instance1);
}
}
输出true 表明是同一个对象,指向同一块内存地址,这样我们就保证了Demo1单例类只有一个对象被创建
🌰2.饿汉式-方式2 静态代码块
创建 饿汉式静态代码块 单例类
public class Demo2 {
//饿汉式单例类 静态代码块
/**
*私有构造方法 让外界不能创建该类对象
*/
private Demo2(){
}
/**
* 声明一个静态的成员变量instance但是不赋值(不创建对象)
* 没有为instance赋值,默认为null
*/
private static Demo2 instance;
/**
* 在静态代码快中为instance赋值(创建对象)
*/
static {
instance = new Demo2();
}
/**
* 提供一个公共的访问方式,让外界可以获取该类的对象 static是因为外界不需要创建对象,直接通过类访问
*/
public static Demo2 getInstance(){
return instance;
}
}
创建 饿汉式静态代码块 测试类
public class Test2 {
public static void main(String[] args) {
Demo2 instance = Demo2.getInstance();
Demo2 instance1 = Demo2.getInstance();
System.out.println(instance == instance1);
}
}
输出true 表明是同一个对象,指向同一块内存地址,这样我们就保证了Demo2单例类只有一个对象被创建
🌰3.饿汉式-方式3(枚举方式)
枚举类实现单例模式是十分推荐的一种单例实现模式,由于枚举类型是线程安全的,并且只会加载一次,这是十分符合单例模式的特点的,枚举的写法很简单,而且枚举方式是所有单例实现中唯一一个不会被破环的单例实现模式
单例类
//枚举方式创建单例
public enum Singleton {
INSTANCE;
}
测试类
public class Test1 {
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
Singleton instance1 = Singleton.INSTANCE;