工厂模式和策略模式都是设计模式中的重要组件,它们用于解决不同类型的软件设计问题。以下是它们之间的区别:
-
目的不同:
- 工厂模式(Factory Pattern)的主要目的是创建对象。它提供了一种创建对象的接口,使得子类可以决定实例化哪一个类。工厂模式的重点在于如何创建和管理对象。
- 策略模式(Strategy Pattern)旨在定义一系列算法,将每个算法封装起来,并使它们可以互换。策略模式使得算法可以在不影响客户端的情况下发生变化。它的重点在于如何使用不同的方法或算法来完成某个行为。
-
使用场景:
- 工厂模式常用于当我们需要在运行时动态决定创建哪个类的实例,并且这些类拥有共同的接口或基类时。
- 策略模式适合用于需要动态改变某个对象的行为或者算法,且这些行为可以彼此替换时。
-
角色不同:
- 工厂模式包括工厂接口(或抽象类)和具体工厂类,它们负责创建产品对象。
- 策略模式包含策略接口和具体策略实现,在上下文类中使用这些策略。
-
设计意图:
- 工厂模式隐藏了创建对象的复杂性和具体实现,客户端只需通过工厂得到所需对象,而不需要知道对象的创建过程。
- 策略模式允许客户端在同一算法家族中选择算法,确保算法的变化不会影响到使用算法的客户。
场景:假设我们有一个应用程序,需要通过不同的方式来创建各种类型的文档,比如Word
文档、PDF
文档、Excel
文档。每种文档类型有不同的创建实现。
实现工厂模式:
-
文档接口:定义一个通用接口或抽象类来表示文档。
javainterface Document { void open(); }
Open in:Code Editor
-
具体文档类:实现文档接口的不同类。
javaclass WordDocument implements Document { public void open() { System.out.println("Opening a Word document."); } } class PdfDocument implements Document { public void open() { System.out.println("Opening a PDF document."); } }
Open in:Code Editor
-
工厂类:通过工厂类提供文档创建的统一接口。
javaclass DocumentFactory { public Document createDocument(String type) { if (type.equalsIgnoreCase("Word")) { return new WordDocument(); } else if (type.equalsIgnoreCase("PDF")) { return new PdfDocument(); } else { throw new IllegalArgumentException("Unknown document type"); } } }
Open in:Code Editor
-
使用工厂:
javapublic class Main { public static void main(String[] args) { DocumentFactory factory = new DocumentFactory(); Document doc = factory.createDocument("Word"); doc.open(); // Output: Opening a Word document. } }
Open in:Code Editor
策略模式案例
场景:假设我们有一个应用程序负责对不同类型的支付进行处理。我们需要支持多种支付策略,例如信用卡支付、支付宝支付和微信支付。
实现策略模式:
-
支付策略接口:定义一个通用接口来表示支付策略。
javainterface PaymentStrategy { void pay(int amount); }
Open in:Code Editor
-
具体策略类:实现支付策略接口的不同类。
javaclass CreditCardPayment implements PaymentStrategy { public void pay(int amount) { System.out.println("Paying " + amount + " using Credit Card."); } } class AlipayPayment implements PaymentStrategy { public void pay(int amount) { System.out.println("Paying " + amount + " using Alipay."); } }
Open in:Code Editor
-
上下文类:在上下文类中使用策略接口。
javaclass PaymentContext { private PaymentStrategy strategy; public PaymentContext(PaymentStrategy strategy) { this.strategy = strategy; } public void executePayment(int amount) { strategy.pay(amount); } }
Open in:Code Editor
-
使用策略:
javapublic class Main { public static void main(String[] args) { PaymentContext context = new PaymentContext(new CreditCardPayment()); context.executePayment(100); // Output: Paying 100 using Credit Card. context = new PaymentContext(new AlipayPayment()); context.executePayment(200); // Output: Paying 200 using Alipay. } }
Open in:Code Editor
区别总结
工厂模式关注的是创建过程,而策略模式关注的是行为或算法的变化。它们可以在不同的设计中单独使用,也可以结合使用以实现更复杂的功能。
-
工厂模式:通过创建工厂类,将对象实例化的责任转移到工厂。当我们不知道需要实例化哪个类时,会使用工厂模式。它隐藏了对象实例化的复杂性。
-
策略模式:允许在执行时选择不同算法或操作。当我们需要动态地改变对象的行为或者算法时,会使用策略模式。这使得算法可以独立于使用它的客户端而变化。