工厂方法模式(Factory Method Pattern)是一种创建型设计模式,用于定义创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。
工厂方法模式包含以下几个关键角色:
- Product(产品接口) :定义了产品的规范,是工厂方法模式所创建对象的超类或接口。
- ConcreteProduct(具体产品类) :实现了产品接口,由具体工厂类创建。
- Creator(创建者抽象类) :声明了工厂方法,用于返回一个产品。
- 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
工厂方法模式的优点包括:
- 封装性:工厂方法模式隐藏了对象创建的具体细节,调用者只需要知道产品的接口。
- 扩展性:当需要添加新的产品时,只需要添加相应的具体产品类和具体创建者类,不需要修改已有代码。
- 解耦:客户端不需要知道具体的类是如何实现的,只需要知道接口。
工厂方法模式的缺点包括:
- 类的增加:每增加一个产品,就需要增加一个具体类和对象实现类,这可能会导致类的数量成倍增加。
工厂方法模式适用于以下场景:
- 当创建逻辑可能涉及到复杂的选择逻辑时。
- 当一个类不知道它所必须创建的对象的类时。
- 当要创建的对象很多时,使用工厂方法可以让系统更加灵活。