Java策略模式和工厂模式的区别

概述

本文将介绍Java中策略模式和工厂模式的区别。首先,我们会通过一个表格展示整个实现过程的步骤。然后,我们会逐步解释每个步骤需要做什么,并提供相应的代码示例和注释。

实现步骤

步骤 策略模式 工厂模式
1 定义策略接口 定义产品接口
2 实现策略类 实现产品类
3 创建上下文类 创建工厂类
4 注入具体策略类 使用工厂类创建产品对象

步骤详解

1. 定义策略接口(Strategy Interface)

在策略模式中,我们首先需要定义一个策略接口,该接口包含所有策略类共同的方法。下面是一个示例:

public interface PaymentStrategy {
    public void pay(double amount);
}

这里我们定义了一个PaymentStrategy接口,其中有一个pay方法用于支付金额。

2. 实现策略类(Strategy Implementation)

接下来,我们需要实现具体的策略类,这些类实现了策略接口并提供了自己的实现逻辑。例如,我们可以创建两个具体的策略类:PayPalStrategyCreditCardStrategy

public class PayPalStrategy implements PaymentStrategy {
    private String email;
    private String password;
    
    public PayPalStrategy(String email, String password) {
        this.email = email;
        this.password = password;
    }
    
    public void pay(double amount) {
        // 在这里实现使用PayPal支付的逻辑
        System.out.println("使用PayPal支付:" + amount);
    }
}

public class CreditCardStrategy implements PaymentStrategy {
    private String cardNumber;
    private String cvv;
    
    public CreditCardStrategy(String cardNumber, String cvv) {
        this.cardNumber = cardNumber;
        this.cvv = cvv;
    }
    
    public void pay(double amount) {
        // 在这里实现使用信用卡支付的逻辑
        System.out.println("使用信用卡支付:" + amount);
    }
}

在上述代码中,我们实现了PayPalStrategyCreditCardStrategy两个具体的策略类,它们分别提供了使用PayPal和信用卡进行支付的逻辑。

3. 创建上下文类(Context Class)

接下来,我们需要创建一个上下文类,该类包含一个策略对象,并提供一个方法用于调用策略对象的支付方法。例如,我们创建一个名为PaymentContext的上下文类:

public class PaymentContext {
    private PaymentStrategy paymentStrategy;
    
    public PaymentContext(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
    
    public void pay(double amount) {
        paymentStrategy.pay(amount);
    }
}

在上述代码中,我们创建了一个PaymentContext类,它包含一个paymentStrategy对象,并提供了一个pay方法用于调用策略对象的支付方法。

4. 注入具体策略类(Injecting Concrete Strategies)

在策略模式中,我们使用上下文类来调用具体的策略对象。下面是一个示例,展示如何使用策略模式进行支付:

public class Main {
    public static void main(String[] args) {
        // 创建上下文对象,并注入具体策略对象
        PaymentContext context = new PaymentContext(new PayPalStrategy("example@gmail.com", "password"));
        
        // 调用上下文对象的支付方法
        context.pay(100.0);
    }
}

在上述代码中,我们创建了一个PaymentContext对象,并注入了一个PayPalStrategy对象。然后,我们调用上下文对象的pay方法进行支付。

工厂模式的区别

工厂模式和策略模式都是常见的设计模式,但它们的用途和实现方式略有不同。

工厂模式的主要目的是创建对象,它通过