Java设计模式之工厂方法模式(Factory Method)

44 阅读2分钟

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,用于定义创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。

工厂方法模式包含以下几个关键角色:

  1. Product(产品接口) :定义了产品的规范,是工厂方法模式所创建对象的超类或接口。
  2. ConcreteProduct(具体产品类) :实现了产品接口,由具体工厂类创建。
  3. Creator(创建者抽象类) :声明了工厂方法,用于返回一个产品。
  4. ConcreteCreator(具体创建者类) :实现了工厂方法,生成一个具体产品。

工厂方法模式的典型代码结构如下:

// 产品接口
interface Product {
    void use();
}

// 具体产品类
class ConcreteProductA implements Product {
    public void use() {
        System.out.println("Product A");
    }
}

class ConcreteProductB implements Product {
    public void use() {
        System.out.println("Product B");
    }
}

// 创建者抽象类
abstract class Creator {
    abstract Product factoryMethod();
}

// 具体创建者类
class ConcreteCreatorA extends Creator {
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator {
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

使用工厂方法模式的示例:

public class Client {
    public static void main(String[] args) {
        Creator creatorA = new ConcreteCreatorA();
        Product productA = creatorA.factoryMethod();
        productA.use();

        Creator creatorB = new ConcreteCreatorB();
        Product productB = creatorB.factoryMethod();
        productB.use();
    }
}

输出结果:

Product A
Product B

工厂方法模式的优点包括:

  • 封装性:工厂方法模式隐藏了对象创建的具体细节,调用者只需要知道产品的接口。
  • 扩展性:当需要添加新的产品时,只需要添加相应的具体产品类和具体创建者类,不需要修改已有代码。
  • 解耦:客户端不需要知道具体的类是如何实现的,只需要知道接口。

工厂方法模式的缺点包括:

  • 类的增加:每增加一个产品,就需要增加一个具体类和对象实现类,这可能会导致类的数量成倍增加。

工厂方法模式适用于以下场景:

  • 当创建逻辑可能涉及到复杂的选择逻辑时。
  • 当一个类不知道它所必须创建的对象的类时。
  • 当要创建的对象很多时,使用工厂方法可以让系统更加灵活。