工厂方法模式是一种创建型设计模式,它定义了一个接口,用于创建对象,但是由子类来决定该创建哪个类的实例。这个模式让一个类的实例化延迟到其子类。
在工厂方法模式中,创建对象的代码由一个称为“工厂”的对象负责,而不是由客户端直接创建。客户端只需要调用工厂的方法来创建对象,无需关心具体实现细节。
示例:
假设有一个披萨店需要提供各种口味的披萨。我们可以使用工厂方法模式来实现不同口味的披萨创建。
首先定义一个抽象的披萨类,以及不同口味的披萨:
public abstract class Pizza {
public abstract void prepare();
public void bake() {
System.out.println("Bake for 25 minutes at 350");
}
public void cut() {
System.out.println("Cutting the pizza into diagonal slices");
}
public void box() {
System.out.println("Place pizza in official PizzaStore box");
}
}
public class CheesePizza extends Pizza {
public void prepare() {
System.out.println("Preparing cheese pizza");
}
}
public class PepperoniPizza extends Pizza {
public void prepare() {
System.out.println("Preparing pepperoni pizza");
}
}
然后定义一个披萨工厂,它负责创建不同口味的披萨:
public abstract class PizzaStore {
public final Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type);
}
public class NYStylePizzaStore extends PizzaStore {
protected Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new NYStyleCheesePizza();
} else if (type.equals("pepperoni")) {
return new NYStylePepperoniPizza();
}
return null;
}
}
public class ChicagoStylePizzaStore extends PizzaStore {
protected Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new ChicagoStyleCheesePizza();
} else if (type.equals("pepperoni")) {
return new ChicagoStylePepperoniPizza();
}
return null;
}
}
现在我们可以在客户端代码中使用工厂方法来创建不同口味的披萨:
public class PizzaTestDrive {
public static void main(String[] args) {
PizzaStore nyStore = new NYStylePizzaStore();
PizzaStore chicagoStore = new ChicagoStylePizzaStore();
Pizza pizza = nyStore.orderPizza("cheese");
System.out.println("Ethan ordered a " + pizza + "\n");
pizza = chicagoStore.orderPizza("cheese");
System.out.println("Joel ordered a " + pizza + "\n");
}
}
这个代码示例演示了工厂方法模式的使用,使得客户端代码不需要知道具体要创建哪个类的实例,而是由具体的工厂类来负责实例化。