[设计模式] 浅谈工厂方法模式

2024 年 4 月 18 日 星期四
/ ,
7

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

工厂方法模式

模式功能说明:是一种创建型设计模式,它定义了一个用于创建对象的接口,但将具体对象的创建延迟到子类中。工厂方法模式通过让子类决定创建的对象类型,来解决简单工厂模式中违反开闭原则的问题。

模式思路与原理

在工厂方法模式中,有四个主要角色:

  1. 抽象产品接口(Product Interface):定义了产品对象的共同接口。
  2. 具体产品类(Concrete Product Class):实现了产品接口,是被创建的对象。
  3. 抽象工厂类(Factory Interface):定义了创建产品对象的工厂方法。
  4. 具体工厂类(Concrete Factory Class):实现了抽象工厂类,负责创建具体的产品对象。

案例

// 抽象产品接口
interface Product {
    void operation();
}

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

// 具体产品类B
class ConcreteProductB implements Product {
    @Override
    public void operation() {
        System.out.println("Concrete Product B");
    }
}

// 抽象工厂类
interface Factory {
    Product createProduct();
}

// 具体工厂类A
class ConcreteFactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

// 具体工厂类B
class ConcreteFactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Factory factoryA = new ConcreteFactoryA();
        Product productA = factoryA.createProduct();
        productA.operation();  // 输出:Concrete Product A

        Factory factoryB = new ConcreteFactoryB();
        Product productB = factoryB.createProduct();
        productB.operation();  // 输出:Concrete Product B
    }
}

存在的问题

  • Q1:客户端需要知道具体工厂类的存在:在客户端代码中,需要显式地创建具体工厂类的实例,这暴露了具体工厂类的实现细节。
  • A1:解决方法是使用依赖注入或反射机制,将具体工厂类的创建交给容器或工厂类来处理,客户端只需要从容器或工厂类中获取工厂实例。

  • Q2:工厂类的创建逻辑不一致:每个具体工厂类的创建逻辑可能不一致,例如,可能需要传入不同的参数或配置信息。当前的示例中,工厂类的创建逻辑是固定的。
  • A2:解决方法是使用工厂配置文件或工厂注册表来存储和管理工厂类的创建逻辑,从而实现更灵活的工厂类创建方式。

  • Q3:工厂类和产品类的耦合度较高:当前的示例中,工厂类和产品类是直接关联的,工厂类需要知道具体产品类的存在。这导致工厂类和产品类之间的耦合度较高,一旦产品类发生变化,工厂类也需要相应地修改。
  • A3:解决方法是使用反射机制,通过反射来创建产品对象,从而降低工厂类和产品类之间的耦合度。

  • Q4:缺乏错误处理机制:当前的工厂方法实现中,如果创建产品对象失败,没有提供良好的错误处理机制。
  • A4:解决方法是在工厂方法中抛出异常,提示客户端创建产品对象失败,从而提供更好的错误处理机制。
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...