工厂方法模式的主要目的是将对象的创建和使用分离,通过引入工厂类来创建对象,从而降低了客户端代码与具体类之间的耦合度,提高了代码的可维护性和可扩展性。
工厂方法模式的核心思想是定义一个抽象的工厂接口,该接口声明了一个用于创建对象的方法,具体的对象创建逻辑由实现该接口的具体工厂类来实现。客户端代码通过调用工厂类的方法来获取对象,而无需关心具体的对象创建过程。
下面以一个简单的示例来详细介绍工厂方法模式的使用:
假设有一个披萨店,它可以制作不同种类的披萨,如芝士披萨、蔬菜披萨等。我们可以使用工厂方法模式来实现披萨的创建过程。
首先,定义一个抽象的披萨类 Pizza
,它包含披萨的一些基本属性和方法。
public abstract class Pizza { protected String name; protected String dough; protected String sauce; public void prepare() { System.out.println("Preparing " + name); System.out.println("Tossing dough..."); System.out.println("Adding sauce..."); } public void bake() { System.out.println("Baking " + name); } public void cut() { System.out.println("Cutting " + name); } public void box() { System.out.println("Boxing " + name); } public String getName() { return name; } }
然后,定义具体的披萨类,如芝士披萨和蔬菜披萨。
public class CheesePizza extends Pizza { public CheesePizza() { name = "Cheese Pizza"; dough = "Regular Crust"; sauce = "Marinara Pizza Sauce"; } } public class VeggiePizza extends Pizza { public VeggiePizza() { name = "Veggie Pizza"; dough = "Thin Crust"; sauce = "Tomato Sauce"; } }
接下来,定义一个抽象的披萨工厂类 PizzaFactory
,它包含一个用于创建披萨对象的方法 createPizza()
。
public abstract class PizzaFactory { public abstract Pizza createPizza(String type); public Pizza orderPizza(String type) { Pizza pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } }
最后,定义具体的披萨工厂类,如芝士披萨工厂和蔬菜披萨工厂。
public class CheesePizzaFactory extends PizzaFactory { public Pizza createPizza(String type) { if (type.equals("cheese")) { return new CheesePizza(); } else { return null; } } } public class VeggiePizzaFactory extends PizzaFactory { public Pizza createPizza(String type) { if (type.equals("veggie")) { return new VeggiePizza(); } else { return null; } } }
使用工厂方法模式的客户端代码如下:
public class PizzaStore { public static void main(String[] args) { PizzaFactory cheesePizzaFactory = new CheesePizzaFactory(); Pizza cheesePizza = cheesePizzaFactory.orderPizza("cheese"); System.out.println("Ordered a " + cheesePizza.getName()); PizzaFactory veggiePizzaFactory = new VeggiePizzaFactory(); Pizza veggiePizza = veggiePizzaFactory.orderPizza("veggie"); System.out.println("Ordered a " + veggiePizza.getName()); } }
运行上述代码,输出结果如下:
Preparing Cheese Pizza Tossing dough... Adding sauce... Baking Cheese Pizza Cutting Cheese Pizza Boxing Cheese Pizza Ordered a Cheese Pizza Preparing Veggie Pizza Tossing dough... Adding sauce... Baking Veggie Pizza Cutting Veggie Pizza Boxing Veggie Pizza Ordered a Veggie Pizza
从上述示例可以看出,工厂方法模式通过引入工厂类来创建对象,客户端代码只需调用工厂类的方法即可获取对象,无需关心具体的对象创建过程。这样可以降低客户端代码与具体类之间的耦合度,提高了代码的可维护性和可扩展性。
总结来说,工厂方法模式是一种创建型设计模式,它通过引入工厂类来创建对象,将对象的创建和使用分离,降低了客户端代码与具体类之间的耦合度。工厂方法模式适用于对象的创建过程比较复杂,或者需要根据不同的条件创建不同的对象的情况。