深入解析Java设计模式:单例模式、工厂方法模式与更多
设计模式是软件开发中用于解决常见设计问题的典型解决方案。它们提供了最佳实践和模板,以帮助开发人员构建灵活、可重用和可维护的软件结构。Java语言中常用的设计模式包括单例模式、工厂方法模式、观察者模式、适配器模式等。在本文中,我们将深入解析前两种模式:单例模式和工厂方法模式。
单例模式 (Singleton Pattern)
目的:单例模式确保一个类只有一个实例,并提供一个全局访问点。
应用场景:
- 当一个类需要严格控制其实例数量时(通常只有一个)。
- 当该类提供的一些全局功能需要统一管理时,例如线程池、配置管理器或日志对象。
实现细节:
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 static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
工厂方法模式 (Factory Method Pattern)
目的:定义一个创建对象的接口,但由子类决定实例化哪个类。工厂方法模式让类的实例化延迟到子类。
应用场景:
- 当一个类不知道它所需要创建的对象的类时。
- 当一个类希望把创建对象的责任委托给子类时。
- 需要在代码中解耦对象的创建和使用时。
实现细节:
- 定义一个工厂方法接口,该接口具有一个用于创建对象的方法。
- 让子类实现该接口,以决定要实例化的类。
// 产品接口
interface Product {
void use();
}
// 具体产品类
class ConcreteProductA implements Product {
public void use() {
System.out.println("使用产品A");
}
}
class ConcreteProductB implements Product {
public void use() {
System.out.println("使用产品B");
}
}
// 工厂接口
interface Factory {
Product createProduct();
}
// 具体工厂类
class ConcreteFactoryA implements Factory {
public Product createProduct() {
return new ConcreteProductA();
}
}
class ConcreteFactoryB implements Factory {
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.use();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.use();
}
}
总结:
- 单例模式用于确保只有一个类的实例,适合需要唯一实例的情况。
- 工厂方法模式将对象的创建与使用分离,适合于需要灵活选择类来实例化的情况。
通过合理使用这些设计模式,开发者可以写出更加灵活、模块化和可维护的代码。设计模式不仅帮助我们解决当前的问题,还能够为未来的变更提供良好的扩展性。