java常用的设计模式

admin 18 0

### Java中常用的设计模式详解

在软件开发领域,设计模式是解决常见问题的最佳实践方案,它们为开发者提供了一种可复用的设计思路,帮助构建灵活、可维护且可扩展的软件系统,Java作为一种广泛使用的编程语言,自然与这些设计模式紧密相连,本文将深入探讨Java中常用的几种设计模式,包括单例模式、工厂模式、策略模式、观察者模式、适配器模式、装饰器模式、代理模式以及模板方法模式,并详细解释每种模式的概念、应用场景及实现方式。

#### 一、单例模式(Singleton Pattern)

**概念**:单例模式确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。

**应用场景**:当需要控制资源访问,如数据库连接、配置文件读取等,或者当类代表了一个无状态的工具类时,单例模式非常有用。

**实现方式**:

- **懒汉式**:在类内部声明类的唯一实例,并通过一个静态方法返回该实例,该方法在第一次被调用时实例化对象,并在以后调用时返回已创建的实例。

- **饿汉式**:在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。

- **双重检查锁定(Double-Checked Locking)**:在懒汉式的基础上,通过双重检查锁定机制来减少同步的开销,提高性能。

- **静态内部类**:利用classloder的机制避免多线程的同步问题,在类装载时就完成了初始化,所以类装载较慢,但获取对象的速度快。

**示例代码**(懒汉式):

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

#### 二、工厂模式(Factory Pattern)

**概念**:工厂模式定义了一个创建对象的接口,但让子类决定要实例化的类是哪一个,工厂方法让类的实例化推迟到子类中进行。

**应用场景**:当对象的创建逻辑较为复杂,或者需要根据不同条件创建不同对象时,可以使用工厂模式。

- **简单工厂模式**:通过一个工厂类根据传入的参数决定创建哪一种类的实例。

- **工厂方法模式**:定义一个创建对象的接口,让子类决定实例化哪一个类。

- **抽象工厂模式**:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

**示例代码**(工厂方法模式):

interface Product {
    void use();
}

class ConcreteProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using ConcreteProductA");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using ConcreteProductB");
    }
}

interface Creator {
    Product factoryMethod();
}

class ConcreteCreatorA implements Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB implements Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

#### 三、策略模式(Strategy Pattern)

**概念**:策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换,策略模式让算法的变化独立于使用算法的客户。

**应用场景**:当有多种算法实现同一个接口,且这些算法可以互换时,可以使用策略模式。

**实现方式**:定义一个策略接口,每个策略实现该接口,并在上下文(Context)类中维护一个策略对象的引用,通过该引用调用具体的策略实现。

**示例代码**:

interface Strategy {
    void execute();
}

class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing strategy A");
    }
}

class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing strategy B");
    }
}

class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();
    }
}

#### 四、观察者模式(Observer Pattern)

**概念**: