工厂模式和策略模式都是常见的设计模式,它们在软件设计中扮演着不同的角色,解决不同的问题。以下是它们的区别:
1. 定义与目的
-
工厂模式(Factory Pattern):
- 定义:工厂模式是一种创建型设计模式,提供了一种创建对象的接口,而不是直接实例化对象。工厂模式通常用于解耦对象的创建过程,使得客户端无需关注具体对象的创建细节。
- 目的:通过使用工厂模式,可以在不修改现有代码的情况下,通过改变工厂类或方法的实现,来控制创建的对象类型。这有助于提高系统的可扩展性和灵活性。
-
策略模式(Strategy Pattern):
- 定义:策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使得它们可以互换。策略模式允许算法在不影响客户端的情况下变化。
- 目的:策略模式的主要目的是让一组相关的算法可以相互替换,避免了使用条件语句来选择算法,从而使代码更加清晰和可维护。
2. 适用场景
-
工厂模式:
- 当系统需要根据输入或配置动态创建不同类型的对象时,使用工厂模式。它适用于对象创建逻辑复杂或者对象创建需要通过某些特定条件控制的情况。
- 例如:不同数据库的连接对象创建、不同日志记录器的实例化等。
-
策略模式:
- 当系统中有多个可替代的算法或行为需要在运行时进行选择时,使用策略模式。它适用于需要在不同情况下使用不同算法或操作的场景。
- 例如:支付系统中不同支付方式的选择、图形处理软件中不同滤镜效果的应用等。
3. 结构与实现
-
工厂模式:
- 结构上,工厂模式通常包括一个工厂类或方法,该工厂负责创建产品对象。工厂方法模式是工厂模式的一种具体实现,其中工厂类通过子类来决定创建哪个产品。
- 例如:
ShapeFactory
类负责创建不同类型的Shape
对象(如Circle
、Square
等)。
-
策略模式:
- 结构上,策略模式通常包括一个策略接口(或抽象类),以及多个实现该接口的策略类。客户端持有对策略接口的引用,可以在运行时选择或切换策略。
- 例如:
CompressionStrategy
接口有不同的实现类如ZipCompressionStrategy
和RarCompressionStrategy
,客户端可以根据需要选择压缩策略。
4. 客户端与模式的关系
-
工厂模式:
- 客户端与工厂类交互,通过工厂类创建所需的对象。客户端不需要直接了解对象的具体类,只需调用工厂方法即可。
-
策略模式:
- 客户端持有策略接口的引用,并在需要时调用具体策略对象的方法。策略模式通常需要客户端决定选择哪个策略类,并将其传递给上下文(Context)对象。
5. 举例说明
-
工厂模式例子:
java// 工厂类 public class ShapeFactory { public Shape getShape(String shapeType) { if (shapeType == null) { return null; } if (shapeType.equalsIgnoreCase("CIRCLE")) { return new Circle(); } else if (shapeType.equalsIgnoreCase("SQUARE")) { return new Square(); } return null; } }
-
策略模式例子:
java// 策略接口 public interface PaymentStrategy { void pay(int amount); } // 策略实现类 public class CreditCardPayment implements PaymentStrategy { public void pay(int amount) { System.out.println("Paid " + amount + " using Credit Card"); } } public class PayPalPayment implements PaymentStrategy { public void pay(int amount) { System.out.println("Paid " + amount + " using PayPal"); } } // 上下文类 public class ShoppingCart { private PaymentStrategy paymentStrategy; public void setPaymentStrategy(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } public void checkout(int amount) { paymentStrategy.pay(amount); } }
总结
- 工厂模式 关注的是对象的创建,通过封装创建逻辑来提高代码的可维护性和扩展性。
- 策略模式 关注的是行为的变化,通过将算法封装成独立的策略类来提供灵活的行为选择和切换。
这两种模式常常结合使用,例如在策略模式中使用工厂模式来创建不同的策略对象。