在软件工程中,设计模式是为常见问题提出的典型解决方案。总共有23种设计模式,这些模式被分为三大类:创建型、结构型和行为型。单例模式是其中的一种创建型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。
单例模式的概念
单例模式通过私有化其构造函数来确保类的实例只能被创建一次。如果实例已经存在,则直接返回现有的实例,否则创建一个新的实例。这确保了在整个应用程序中,该类只有一个实例存在。
单例模式的优点
- 资源控制:单例模式可以精确控制资源和对象的使用,如配置信息管理、线程池、缓存等。
- 全局访问点:提供了一个全局访问点,全局性的控制资源访问。
- 节省资源:由于实例限制为一个,避免了对资源的重复浪费。
单例模式的缺点
- 全局状态:全局的单个实例可能引起资源的全局访问冲突,特别是在多线程环境下。
- 可扩展性差:难以继承单例类,因为构造函数是私有的。
- 测试困难:单例模式的全局状态使得单元测试变得困难,因为测试代码可能需要访问和修改私有构造函数。
Java代码示例
下面是一个Java中实现单例模式的基本示例,使用了所谓的“懒汉式”加载方法,这种方法第一次调用getInstance()方法时才创建实例:
java复制代码
public class Singleton {
// 私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载
private static Singleton instance = null;
// 私有构造方法,防止被实例化
private Singleton() {
}
// 静态工程方法,创建实例
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
// 如果该对象被用于序列化,可以保证对象在序列化前后保持一致
public Object readResolve() {
return instance;
}
}
这个例子中使用了懒汉式的单例实现,它是线程安全的,因为getInstance()方法是同步的。但是,每次调用getInstance()方法都会进行线程锁定检查,这可能会影响性能。在高性能需求下,可以考虑使用其他单例实现方式,如双重检查锁定或静态内部类等方法,以减少性能开销。