工厂模式:创建与业务逻辑解耦的实例化策略

需积分: 19 5 下载量 156 浏览量 更新于2024-07-13 收藏 1.16MB PPT 举报
"这篇内容主要介绍了工厂设计模式在Java中的应用,通过实例展示了如何使用工厂方法来解决对象创建的问题,并探讨了面向抽象编程的重要性。" 工厂设计模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。在这个模式中,一个工厂类负责创建对象,而客户端代码则不再直接通过`new`关键字实例化对象,而是调用工厂类的工厂方法来获取对象。这样做的好处是将对象的创建过程封装了起来,使得客户端代码与具体的实现类解耦,增强了系统的灵活性和可扩展性。 在给定的描述中,`PizzaStore`类是一个抽象基类,它定义了一个`orderPizza`方法,这个方法负责创建披萨、准备、烘烤、切割和打包披萨。然而,`createPizza`方法是抽象的,具体的披萨类型(如`MallardDuck`)的实例化是在`PizzaStore`的子类中实现的。这种设计使得`PizzaStore`可以根据不同的场景实例化不同类型的披萨,比如在不同的国家可能会有不同的披萨种类。 当我们谈论面向抽象编程时,我们指的是应该依赖于接口而不是具体的实现。在上述代码中,`Pizza`是抽象类或者是接口,它定义了披萨的基本行为,如`prepare()`, `bake()`, `cut()`, 和 `box()`。这样,即使添加了新的披萨类型,例如`VegetarianPizza`,原有代码也不需要修改,只需创建一个新的子类并实现这些方法即可。 问题在于,当客户端代码直接使用`new MallardDuck()`这样的语句时,它与`MallardDuck`类产生了紧密的耦合。一旦需要改变或扩展,比如增加新的鸭子类型,就需要修改客户端代码。工厂模式通过将对象的创建过程封装到一个单独的工厂方法中,使得客户端可以无须关心具体类的细节,只需知道如何调用工厂方法即可。 在披萨店的例子中,`PizzaStore`类中的`orderPizza`方法本应是一个抽象方法或者接口,以便于各种类型的披萨店(如纽约风味披萨店、芝加哥深盘披萨店)实现自己的披萨创建逻辑。但因为Java的抽象类或接口不能被实例化,所以`PizzaStore`只能是一个具体类,然后通过子类化来实现不同的`createPizza`方法。 总结一下,工厂设计模式的关键在于提供一个创建对象的接口,让子类决定实例化哪一个类。这样,工厂方法使得系统独立于产品创建、组合和表示等细节,同时也使得系统更加灵活,易于扩展。在Java中,我们可以利用接口或者抽象类来实现工厂模式,以提高代码的可维护性和可扩展性。