工厂方法模式

187 阅读3分钟

概要

工厂方法模式是一种常见的设计模式,它被广泛应用于面向对象编程中,旨在提供一种灵活的方法来创建对象。在本文中,我们将介绍工厂方法模式的概念、用途和实现方法。

主要架构图

structure-2x.png

工厂方法的概念

工厂方法模式是一种创建型设计模式,它提供了一种创建对象的标准化接口,但具体的对象创建过程由子类决定。这种模式可以让我们将对象的创建和使用分离开来,从而使得代码更加灵活和可扩展。

工厂方法的用途

工厂方法的主要用途是将对象的创建过程封装起来,使得我们可以在不改变现有代码的情况下增加新的对象类型。这种模式通常用于以下场景:

  1. 封装对象的创建过程。使用工厂方法模式可以将对象的创建过程封装在工厂类中,使得客户端无需关心对象的创建细节,从而降低了客户端的耦合度。
  2. 提供标准化的接口。工厂方法模式提供了一个标准化的接口,使得客户端可以通过该接口来创建不同类型的对象。这样一来,客户端无需了解对象的具体实现,只需要使用工厂类提供的接口即可。
  3. 支持对象的扩展。工厂方法模式支持对象的扩展,可以根据需要添加新的产品类型和工厂类型,而不必改变现有的代码。这样一来,工厂方法模式可以保证代码的可扩展性和可维护性。
  4. 实现对象的多态性和继承性。工厂方法模式基于多态性和继承性,从而提高代码的灵活性和可扩展性。
  5. 降低代码的复杂度。使用工厂方法模式可以将复杂的对象创建过程分解成简单的工厂类和产品类,从而降低了代码的复杂度,使得代码更加易于理解和维护。

工厂方法的实现方法

将对象的创建过程抽象成一个接口,由具体的工厂子类实现该接口来创建不同的对象。

总结

工厂方法模式是一种常见的设计模式,它提供了一种灵活的方法来创建对象。通过将对象的创建和使用分离开来,工厂方法模式可以使得代码更加灵活和可扩展。

代码示例

// Product.java
public interface Product {
    void doSomething();
}

// ConcreteProduct1.java
public class ConcreteProduct1 implements Product {
    @Override
    public void doSomething() {
        System.out.println("ConcreteProduct1 does something");
    }
}

// ConcreteProduct2.java
public class ConcreteProduct2 implements Product {
    @Override
    public void doSomething() {
        System.out.println("ConcreteProduct2 does something");
    }
}

// Factory.java
public abstract class Factory {
    public abstract Product createProduct();
}

// ConcreteFactory1.java
public class ConcreteFactory1 extends Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProduct1();
    }
}

// ConcreteFactory2.java
public class ConcreteFactory2 extends Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProduct2();
    }
}

// Main.java
public class Main {
    public static void main(String[] args) {
        Factory factory1 = new ConcreteFactory1();
        Product product1 = factory1.createProduct();
        product1.doSomething(); // 输出 "ConcreteProduct1 does something"

        Factory factory2 = new ConcreteFactory2();
        Product product2 = factory2.createProduct();
        product2.doSomething(); // 输出 "ConcreteProduct2 does something"
    }
}

在上面的示例中,主要解释如下:

  1. 定义了一个 Product 接口和两个实现类 ConcreteProduct1ConcreteProduct2
  2. 定义了一个抽象工厂类 Factory,该类提供了一个抽象方法 createProduct 来创建不同的产品对象。
  3. 定义两个具体工厂类 ConcreteFactory1ConcreteFactory2,它们分别实现了 Factory 类的 createProduct 方法,并分别返回了 ConcreteProduct1ConcreteProduct2 对象。
  4. Main 类中,我们通过工厂类创建了不同的工厂对象 factory1factory2,并通过调用 createProduct 方法来创建不同的产品对象 product1product2
  5. 调用了product1product2doSomething 方法来输出对应的信息。

参考资料

refactoring.guru/design-patt…