跳转至

Java 工厂模式示例详解

简介

在 Java 编程中,设计模式是解决常见问题的通用解决方案。工厂模式作为一种创建型设计模式,提供了一种创建对象的方式,将对象的创建和使用分离。这使得代码的可维护性和可扩展性得到极大提升。本文将详细介绍 Java 工厂模式示例,包括基础概念、使用方法、常见实践以及最佳实践。

目录

  1. 基础概念
  2. 使用方法
    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
  3. 常见实践
  4. 最佳实践
  5. 小结
  6. 参考资料

基础概念

工厂模式的核心思想是将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象。这样做的好处是,当对象的创建逻辑发生变化时,只需要修改工厂类,而不需要修改所有使用该对象的客户端代码。

工厂模式主要有三种类型: - 简单工厂模式:简单工厂模式不属于 GOF 23 种设计模式之一,但它是工厂模式的基础。它定义了一个工厂类,用于创建产品对象。 - 工厂方法模式:工厂方法模式是在简单工厂模式的基础上,将创建方法抽象成抽象方法,由具体的工厂子类实现。 - 抽象工厂模式:抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

使用方法

简单工厂模式

简单工厂模式包含三个角色: - 工厂类(Creator):负责创建产品对象。 - 产品类(Product):定义产品的接口或抽象类。 - 具体产品类(ConcreteProduct):实现产品接口或继承产品抽象类。

示例代码:

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

// 具体产品类
class ConcreteProduct implements Product {
    @Override
    public void operation() {
        System.out.println("执行具体产品的操作");
    }
}

// 工厂类
class SimpleFactory {
    public Product createProduct() {
        return new ConcreteProduct();
    }
}

// 客户端代码
public class SimpleFactoryExample {
    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        Product product = factory.createProduct();
        product.operation();
    }
}

工厂方法模式

工厂方法模式在简单工厂模式的基础上,将创建方法抽象成抽象方法,由具体的工厂子类实现。它包含四个角色: - 抽象工厂类(Creator):定义创建产品的抽象方法。 - 具体工厂类(ConcreteCreator):实现抽象工厂类的创建方法。 - 产品类(Product):定义产品的接口或抽象类。 - 具体产品类(ConcreteProduct):实现产品接口或继承产品抽象类。

示例代码:

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

// 具体产品类
class ConcreteProduct implements Product {
    @Override
    public void operation() {
        System.out.println("执行具体产品的操作");
    }
}

// 抽象工厂类
abstract class Factory {
    public abstract Product createProduct();
}

// 具体工厂类
class ConcreteFactory extends Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProduct();
    }
}

// 客户端代码
public class FactoryMethodExample {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        Product product = factory.createProduct();
        product.operation();
    }
}

抽象工厂模式

抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它包含五个角色: - 抽象工厂类(AbstractFactory):定义创建一系列产品的抽象方法。 - 具体工厂类(ConcreteFactory):实现抽象工厂类的创建方法。 - 抽象产品类(AbstractProduct):定义产品的接口或抽象类。 - 具体产品类(ConcreteProduct):实现抽象产品类的接口或继承抽象产品类。 - 客户端(Client):使用抽象工厂类创建产品对象。

示例代码:

// 抽象产品 A
interface AbstractProductA {
    void operationA();
}

// 具体产品 A1
class ConcreteProductA1 implements AbstractProductA {
    @Override
    public void operationA() {
        System.out.println("执行具体产品 A1 的操作");
    }
}

// 具体产品 A2
class ConcreteProductA2 implements AbstractProductA {
    @Override
    public void operationA() {
        System.out.println("执行具体产品 A2 的操作");
    }
}

// 抽象产品 B
interface AbstractProductB {
    void operationB();
}

// 具体产品 B1
class ConcreteProductB1 implements AbstractProductB {
    @Override
    public void operationB() {
        System.out.println("执行具体产品 B1 的操作");
    }
}

// 具体产品 B2
class ConcreteProductB2 implements AbstractProductB {
    @Override
    public void operationB() {
        System.out.println("执行具体产品 B2 的操作");
    }
}

// 抽象工厂类
abstract class AbstractFactory {
    public abstract AbstractProductA createProductA();
    public abstract AbstractProductB createProductB();
}

// 具体工厂 1
class ConcreteFactory1 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB1();
    }
}

// 具体工厂 2
class ConcreteFactory2 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB2();
    }
}

// 客户端代码
public class AbstractFactoryExample {
    public static void main(String[] args) {
        AbstractFactory factory1 = new ConcreteFactory1();
        AbstractProductA productA1 = factory1.createProductA();
        AbstractProductB productB1 = factory1.createProductB();
        productA1.operationA();
        productB1.operationB();

        AbstractFactory factory2 = new ConcreteFactory2();
        AbstractProductA productA2 = factory2.createProductA();
        AbstractProductB productB2 = factory2.createProductB();
        productA2.operationA();
        productB2.operationB();
    }
}

常见实践

  • 对象创建逻辑复杂时:当对象的创建过程涉及到多个步骤、复杂的初始化逻辑或依赖其他对象时,使用工厂模式将创建逻辑封装在工厂类中,可以使客户端代码更加简洁。
  • 根据不同条件创建对象时:例如根据配置文件、用户选择或运行时环境等条件创建不同类型的对象,工厂模式可以通过在工厂类中添加逻辑来实现。
  • 代码维护和扩展:当需要添加新的产品类型或修改产品的创建逻辑时,只需要在工厂类中进行修改,而不会影响到其他大量的客户端代码。

最佳实践

  • 单一职责原则:工厂类应该只负责对象的创建,避免承担过多的职责。如果工厂类的创建逻辑过于复杂,可以进一步拆分工厂类。
  • 依赖注入:在工厂类中,可以使用依赖注入的方式来获取创建对象所需的依赖,这样可以提高代码的可测试性和可维护性。
  • 缓存机制:对于一些创建成本较高的对象,可以在工厂类中添加缓存机制,避免重复创建相同的对象。

小结

工厂模式是 Java 编程中一种非常实用的设计模式,它将对象的创建和使用分离,提高了代码的可维护性和可扩展性。通过简单工厂模式、工厂方法模式和抽象工厂模式的不同应用场景,我们可以根据实际需求选择合适的工厂模式来优化代码结构。在实际开发中,遵循最佳实践可以使代码更加健壮和高效。

参考资料