本文共 2237 字,大约阅读时间需要 7 分钟。
在前几篇文章中,我们已经学习了简单工厂模式的实现方法。今天,我们将探讨另一种常见的设计模式——工厂方法模式。这个模式在软件开发中非常有用,尤其是在需要创建多种不同产品的情况下。
工厂方法模式的核心思想是:通过抽象工厂接口,为每个具体的产品类型提供对应的工厂类。这样一来,每个工厂类负责创建特定类型的产品,而调用者只需要通过抽象工厂接口调用相应的工厂方法来获取所需的产品。
首先,我们定义一个抽象工厂接口 FruitFactory,这个接口包含一个 getFruit 方法,返回一个 Fruit 类型的对象。
public interface FruitFactory { public Fruit getFruit();} 接下来,我们定义水果的具体实现类。每个水果类都必须实现 Fruit 接口,并提供自己的 process 方法,用于展示该水果的特性。
public class Apple implements Fruit { public void process() { System.out.println("I am an Apple"); }}public class Pear implements Fruit { public void process() { System.out.println("I am a Pear"); }}public class Orange implements Fruit { public void process() { System.out.println("I am an Orange"); }} 对于每种水果,我们都需要一个对应的工厂类,这些工厂类实现 FruitFactory 接口,并提供 getFruit 方法来返回对应的水果实例。
public class AppleFactory implements FruitFactory { public Fruit getFruit() { return new Apple(); }}public class PearFactory implements FruitFactory { public Fruit getFruit() { return new Pear(); }}public class OrangeFactory implements FruitFactory { public Fruit getFruit() { return new Orange(); }} 为了验证我们的实现是否正确,我们编写一个测试类 FruitTest,创建不同类型的工厂,并调用它们的 getFruit 方法来获取相应的水果实例,然后执行 process 方法。
public class FruitTest { public static void main(String[] args) { FruitFactory appleFactory = new AppleFactory(); Fruit apple = appleFactory.getFruit(); apple.process(); FruitFactory pearFactory = new PearFactory(); Fruit pear = pearFactory.getFruit(); pear.process(); }} 工厂方法模式由以下几个角色组成:
抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 getFruit() 来创建水果产品。
具体工厂(Concrete Factory):实现抽象工厂中的抽象方法,创建具体的产品。每个具体工厂对应一种产品类型。
抽象产品(Abstract Product):定义了产品规范,例如所有水果共同的特性。
具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,且与具体工厂一一对应。
工厂方法模式与简单工厂模式的主要区别在于:
一对一的关系:工厂方法模式中,每个工厂对应一种产品,各司其职。这种一对一的关系使得当需要扩展新的产品类型时,只需添加新的工厂类和相应的产品实现类即可。
可扩展性:对于产品类型较多的情况,工厂方法模式比简单工厂模式更容易扩展,因为只需要添加新的工厂和产品类,而无需修改现有的代码。
维护方便:每个工厂类只负责创建一种产品,代码结构清晰,方便维护和理解。
工厂方法模式通过将产品的创建过程从具体的产品类中解耦,使得系统更加灵活和可扩展。通过定义抽象工厂接口和具体工厂类,我们可以轻松地添加新的产品类型,而无需对现有的代码进行修改。这种设计模式在面对多种产品类型且创建过程复杂的情况下,非常有用。
转载地址:http://mdmzz.baihongyu.com/