嗨大家好,欢迎来到风筝的规划形式专栏。我相信快节奏的生活下,文字的力气依然强壮!
上节课带读者认识了规划形式。今天咱们来讲规划形式中的单例形式。开整!

  • 创立型形式是一种常见的规划形式,它关注怎么创立目标的问题,并且能够协助咱们在创立目标时更加灵活、方便地操控目标的生成进程。同时,创立型形式也能够协助咱们削减代码的冗余度,进步代码的可读性和可维护性。

一、什么是单例形式?

单例形式是一种创立型规划形式,它能够保证一个类只要一个实例,并供给一个大局拜访点来拜访该实例。换句话说,单例形式能够让你在应用程序中创立大局仅有的目标。

二、为什么需求单例形式?

在许多应用程序中,咱们需求保证某些目标只要一个实例。比方,在一个 Web 应用程序中,一个数据库连接池目标就能够被规划成单例形式。这样就能够保证每个请求都运用同一个数据库连接池目标,然后防止因频频创立数据库连接池目标而导致的体系功能下降。

别的,单例形式还能够协助咱们完成懒加载 (lazy loading) 和节约体系资源的重要任务。

三、单例形式的完成

要完成单例形式,咱们需求留意以下两个问题:

  1. 怎么保证一个类只要一个实例?
  2. 怎么在整个应用程序中拜访该实例?

1. 怎么保证一个类只要一个实例?

Java 中,单例形式的完成办法通常有两种:饿汉式 (Eager Initialization) 和懒汉式 (Lazy Initialization)。

饿汉式单例形式

饿汉式单例形式是指在类加载时就创立好了一个静态实例,保证了线程安全性。其代码示例如下:

java仿制代码
public class Singleton {
    // 在类加载时就创立好了一个静态实例
    private static Singleton instance = new Singleton();
    private Singleton() {
        // 私有化结构办法,防止外界直接实例化该类
    }
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式单例形式

懒汉式单例形式是指只要在需求用到实例时才去创立它,这样能够节约体系资源。但是懒汉式单例形式在多线程环境下可能会呈现竞争条件,需求留意线程安全问题。其代码示例如下:

java仿制代码
public class Singleton {
    private static Singleton instance;
    private Singleton() {
        // 私有化结构办法,防止外界直接实例化该类
    }
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

静态内部类

别的,除了上述提到的饿汉式和懒汉式单例形式之外,还有一种线程安全的办法是利用静态内部类来完成单例,这种办法既能保证线程安全,又能完成懒加载。具体完成如下:

java仿制代码
public class Singleton {
    private Singleton() {}
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

十分简洁明了,并且也十分安全可靠,推荐运用。

2. 怎么在整个应用程序中拜访该实例?

为了保证咱们在整个应用程序中能够拜访到该实例,咱们需求为单例形式供给一个大局拜访点。一般来说,咱们运用静态办法来完成这个大局拜访点。具体代码示例如下:

java仿制代码
public class Singleton {
    private static Singleton instance;
    private Singleton() {
        // 私有化结构办法,防止外界直接实例化该类
    }
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
    public void doSomething() {
        // 这里是单例目标要履行的操作
    }
}

四、单例形式的优缺点

1. 优点

  • 单例形式能够保证一个类只要一个实例。
  • 单例形式能够节约体系资源,防止因频频创立目标而导致的内存开销过大问题。
  • 单例形式供给了一个大局拜访点,方便咱们在整个应用程序中拜访该实例。

2. 缺点

  • 单例形式会使代码更加复杂。由于它需求对多线程环境做出考虑,因而可能需求运用到双重查看确定 (Double-check Locking)、volatile 等技能。
  • 单例形式可能会降低代码的可测验性。由于它可能会在测验进程中产生一些不必要的依赖联系,然后使得测验变得困难。

五、怎么运用单例形式?

在面向目标编程中,单例形式是一个十分常见和有用的规划形式。以下是单例形式的运用过程:

  1. 界说一个私有的结构办法,防止外界直接实例化该类。
  2. 声明一个私有的静态变量,用于保存该类的仅有实例。
  3. 供给一个公有的静态办法来获取该实例。
  4. 在该办法中完成对实例化的操控,使得每次获取到的都是同一个实例。

代码示例:

java仿制代码
public class Singleton {
    private static Singleton instance;
    private Singleton() {
        // 私有化结构办法,防止外界直接实例化该类
    }
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
    public void doSomething() {
        // 这里是单例目标要履行的操作
    }
}

在需求运用该单例目标的场景下,咱们能够通过静态办法 getInstance() 来获取该实例,然后调用它的各种办法。例如:

java仿制代码
public class Test {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2); // 输出 true,阐明 s1 和 s2 指向的是同一个目标
    }
}

六、小结

以上便是关于单例形式的详细介绍和示例代码。在实践编程中,单例形式是一个十分常见和有用的规划形式,在需求保证大局仅有性且节约体系资源时能够考虑运用。但是,咱们需求留意单例形式的优缺点,防止过度运用它,避免形成代码的不必要复杂性。