如何自定义一个单例类?

要自定义编写一个单例类,有两种方法如下:

一、饿汉式单例:

饿汉式单例指的是在类加载时就创建并初始化单例对象。下面是一个简单的饿汉式单例Bean的示例:

java
public class MySingleton {
    private static final MySingleton instance = new MySingleton(); // 饿汉式单例对象

    private MySingleton() {
        // 私有化构造方法
    }

    public static MySingleton getInstance() {
        return instance; // 直接返回单例对象的引用

二、懒汉式单例:

1、将类的构造方法私有化,以防止其他代码通过new关键字创建对象。

2、在类内部创建一个私有静态成员变量,用于保存单例对象的引用。

3、提供一个公共的静态方法,用于获取单例对象的引用。

4、在该公共静态方法中判断单例对象是否已经被创建

5、如果单例对象为空,则创建一个新的对象并赋值给单例对象。

6、如果单例对象已经存在,则直接返回该对象的引用。

可选:对于多线程环境下的单例类,需要考虑线程安全性,可以采用双重检查锁定或者静态内部类等方式来实现线程安全的单例。

下面是一个简单的单例类示例,基于懒汉式的实现方式:

public class MySingleton {
    private static MySingleton instance; // 私有静态成员变量,保存单例对象的引用

    private MySingleton() {
        // 私有化构造方法
    }

    public static MySingleton getInstance() {
        if (instance == null) { // 判断单例对象是否为空
            synchronized (MySingleton.class) { // 使用双重检查锁定保证线程安全
                if (instance == null) {
                    instance = new MySingleton(); // 创建单例对象
                }
            }
        }
        return instance; // 返回单例对象的引用
    }
}

三、总结:

饿汉式和懒汉式是两种常见的单例设计模式,它们有不同的实现方式和适用场景,下面是对它们的总结以及应用场景区别的说明

  1. 饿汉式单例:

    • 类加载时就创建并初始化单例对象。
    • 优点:简单直观,线程安全,不需要考虑多线程同步问题。
    • 缺点:无论是否使用单例对象,都会在类加载时创建对象,可能占用一定的资源
    • 适用场景:适用于单线程环境或确保一定会使用到单例对象的场景,对性能要求较高
  2. 懒汉式单例:

    • 第一次调用获取单例对象的方法时才创建并初始化单例对象。
    • 优点:延迟加载,节省资源,在不使用单例对象时不会创建。
    • 缺点:需要考虑多线程环境下的线程安全问题,需要进行同步处理。
    • 适用场景:适用于多线程环境或希望在需要时才创建对象的场景,对性能要求相对较低

区别:

  • 初始化时间:饿汉式在类加载时就初始化单例对象,而懒汉式在第一次调用时才初始化。
  • 线程安全性:饿汉式天生线程安全,懒汉式需要考虑多线程环境下的线程安全性问题。
  • 资源占用:饿汉式无论是否使用单例对象,都会在类加载时创建对象,可能占用相应的资源;懒汉式在不使用单例对象时不会创建,延迟资源占用

你可能感兴趣的:(java,开发语言)