工厂模式:以张三订购披萨为例,理解对象创建问题与解耦策略

需积分: 9 6 下载量 102 浏览量 更新于2024-07-13 收藏 359KB PPT 举报
在软件设计模式中,工厂模式是一种常用的设计策略,用于解决对象创建的问题,特别是当需要在运行时动态决定创建哪种具体类型对象时。本文将以张三订购披萨为例,探讨如何运用工厂模式来简化代码,提高灵活性和可维护性。 在一个全球化的软件环境中,例如张三通过一个统一的PizzaStore接口订购披萨,我们通常希望代码能够根据用户的输入或系统配置动态选择不同类型的披萨。原始代码片段展示了这种需求,通过`nyPizzaStore.orderPizza("cheese")`调用,内部通过`createPizza`方法根据参数创建相应的披萨对象: ```java Pizza pizza = createPizza("cheese"); ``` 在这个例子中,`createPizza`方法扮演了工厂的角色,它根据传入的字符串(如"cheese")创建出具体的披萨类型,如`NYPizzaStore`中的`NYPizza`。这种方式避免了直接使用`new`关键字创建特定实现,从而遵循面向接口编程的原则,增强了设计的灵活性。 然而,直接在代码中通过if-else语句动态判断并实例化不同类型的披萨(如`MallardDuck`, `DecoyDuck`, `RubberDuck`)的问题在于它没有将变化部分(即披萨类型)与不变部分(如订购流程)分离。这样的设计在面临应用变更或扩展时,如新增披萨种类,会导致代码重复修改,增加了维护成本和引入错误的风险。 工厂模式的核心思想是通过一个抽象的工厂类或工厂方法来隐藏对象的创建过程,仅暴露创建接口。在PizzaStore场景中,理想的情况是有一个抽象的`PizzaFactory`接口,或者一个具体工厂类如`NYPizzaFactory`,它负责创建不同类型的具体披萨: ```java public interface PizzaFactory { Pizza createPizza(String type); } public class NYPizzaFactory implements PizzaFactory { public Pizza createPizza(String type) { // 创建并返回对应类型的披萨 } } // 在PizzaStore中 Pizza pizza = factory.createPizza("cheese"); ``` 通过这种方式,如果需要添加新的披萨类型,只需要在工厂类中添加新实现,而不会影响到`orderPizza`方法。这样,不仅保持了面向接口编程的灵活性,也实现了变化的隔离,提高了代码的可维护性和扩展性。 总结,工厂模式通过封装对象的创建过程,允许在运行时动态创建对象,解决了软件设计中对象创建的复杂性和变化性问题,是软件工程中处理这些问题的有效工具。在张三订购披萨的例子中,使用工厂模式可以提升代码的可复用性、可扩展性和可维护性,符合面向对象设计的原则。