工厂模式(Factory Pattern)和策略模式(Strategy Pattern)是两种常用的设计模式,它们在软件开发中有不同的应用场景和实现方式。
工厂模式(Factory Pattern):
工厂模式是一种创建型设计模式,用于创建对象而无需指定具体类的实例化过程。它包括工厂方法模式和抽象工厂模式,其中工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪个类;抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口。
策略模式(Strategy Pattern):
策略模式是一种行为设计模式,定义一系列算法,将每个算法封装起来,并使它们可以互相替换。通过策略模式,可以在运行时选择算法的变体或行为。
区别:
-
目的:
- 工厂模式的主要目的是封装对象的创建过程,使客户端代码与具体类的实例化解耦。
- 策略模式的主要目的是定义一系列算法,使它们可以相互替换。
-
应用场景:
- 工厂模式通常在需要根据条件创建不同类型的对象时使用。
- 策略模式通常在需要在运行时动态地选择算法时使用
Java 代码示例:
工厂模式示例:
// 产品接口
interface Product {
void print();
}
// 具体产品类 A
class ConcreteProductA implements Product {
@Override
public void print() {
System.out.println("Product A");
}
}
// 具体产品类 B
class ConcreteProductB implements Product {
@Override
public void print() {
System.out.println("Product B");
}
}
// 工厂类
class Factory {
public Product createProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
}
return null;
}
}
public class FactoryPatternExample {
public static void main(String[] args) {
Factory factory = new Factory();
Product productA = factory.createProduct("A");
Product productB = factory.createProduct("B");
productA.print();
productB.print();
}
}
策略模式示例:
// 策略接口
interface Strategy {
void execute();
}
// 具体策略类 A
class ConcreteStrategyA implements Strategy {
@Override
public void execute() {
System.out.println("Executing strategy A");
}
}
// 具体策略类 B
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 executeStrategy() {
strategy.execute();
}
}
public class StrategyPatternExample {
public static void main(String[] args) {
Strategy strategyA = new ConcreteStrategyA();
Strategy strategyB = new ConcreteStrategyB();
Context context = new Context(strategyA);
context.executeStrategy();
context = new Context(strategyB);
context.executeStrategy();
}
}
在工厂模式示例中,工厂类负责创建产品对象,根据传入的参数选择创建哪种产品。而在策略模式示例中,Context类负责执行具体的策略,根据传入的策略对象执行不同的算法。