嗨大家好,欢迎来到风筝的规划形式专栏。我相信快节奏的生活下,文字的力气依然强壮!
上节课带读者认识了规划形式。今天咱们来讲规划形式中的单例形式。开整!
- 创立型形式是一种常见的规划形式,它关注怎么创立目标的问题,并且能够协助咱们在创立目标时更加灵活、方便地操控目标的生成进程。同时,创立型形式也能够协助咱们削减代码的冗余度,进步代码的可读性和可维护性。
一、什么是单例形式?
单例形式是一种创立型规划形式,它能够保证一个类只要一个实例,并供给一个大局拜访点来拜访该实例。换句话说,单例形式能够让你在应用程序中创立大局仅有的目标。
二、为什么需求单例形式?
在许多应用程序中,咱们需求保证某些目标只要一个实例。比方,在一个 Web 应用程序中,一个数据库连接池目标就能够被规划成单例形式。这样就能够保证每个请求都运用同一个数据库连接池目标,然后防止因频频创立数据库连接池目标而导致的体系功能下降。
别的,单例形式还能够协助咱们完成懒加载 (lazy loading) 和节约体系资源的重要任务。
三、单例形式的完成
要完成单例形式,咱们需求留意以下两个问题:
- 怎么保证一个类只要一个实例?
- 怎么在整个应用程序中拜访该实例?
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 等技能。
- 单例形式可能会降低代码的可测验性。由于它可能会在测验进程中产生一些不必要的依赖联系,然后使得测验变得困难。
五、怎么运用单例形式?
在面向目标编程中,单例形式是一个十分常见和有用的规划形式。以下是单例形式的运用过程:
- 界说一个私有的结构办法,防止外界直接实例化该类。
- 声明一个私有的静态变量,用于保存该类的仅有实例。
- 供给一个公有的静态办法来获取该实例。
- 在该办法中完成对实例化的操控,使得每次获取到的都是同一个实例。
代码示例:
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 指向的是同一个目标
}
}
六、小结
以上便是关于单例形式的详细介绍和示例代码。在实践编程中,单例形式是一个十分常见和有用的规划形式,在需求保证大局仅有性且节约体系资源时能够考虑运用。但是,咱们需求留意单例形式的优缺点,防止过度运用它,避免形成代码的不必要复杂性。