单例模式
概述
单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在需要控制对象实例数量的场景中非常有用,例如数据库连接池、日志系统等。
实现方式
单例模式有多种实现方式,以下是一些常见的实现方法:
1. 懒汉式
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2. 饿汉式
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
3. 双重校验锁
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
应用场景
单例模式适用于以下场景:
- 系统中只需要有一个实例,例如数据库连接池。
- 实例化开销较大,且创建后需使用频繁。
- 需要避免多个实例导致的频繁资源消耗。
依赖注入
概述
依赖注入(Dependency Injection,简称DI)是一种设计模式,它允许在运行时动态地将依赖关系注入到目标对象中。这种模式有助于降低模块间的耦合度,提高代码的可测试性和可维护性。
实现方式
依赖注入有多种实现方式,以下是一些常见的实现方法:
1. 构造器注入
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void saveUser(User user) {
userRepository.save(user);
}
}
2. 属性注入
public class UserService {
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void saveUser(User user) {
userRepository.save(user);
}
}
3. 方法注入
public class UserService {
private UserRepository userRepository;
public void setRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void saveUser(User user) {
userRepository.save(user);
}
public void injectRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
应用场景
依赖注入适用于以下场景:
- 降低模块间的耦合度,提高代码的可测试性和可维护性。
- 在运行时动态地注入依赖关系,适应不同的运行环境。
- 方便组件的替换和扩展。
实战技巧
单例模式实战技巧
- 选择合适的实现方式,根据实际需求选择懒汉式、饿汉式或双重校验锁。
- 使用volatile关键字保证单例的可见性。
- 避免在单例中声明静态成员变量,以免产生多个实例。
依赖注入实战技巧
- 选择合适的注入方式,根据实际情况选择构造器注入、属性注入或方法注入。
- 使用依赖注入框架,如Spring、Dagger等,简化依赖注入的实现。
- 注意依赖注入的顺序和依赖关系的正确性。
通过以上解析和实战技巧,相信读者对单例模式和依赖注入有了更深入的了解。在实际开发中,合理运用这两种设计模式,可以提高代码的质量和可维护性。
