【Java】设计模式——工厂模式

前言

在软件开发中,设计模式是一种解决常见问题的标准方法。工厂模式(Factory Pattern)是其中最常用的一种创建型设计模式,它提供了一个接口用于创建对象,但不暴露对象的创建逻辑。通过工厂模式,我们可以将对象的创建与使用分离,使得系统具有更好的灵活性和可扩展性。

1. 什么是工厂模式

工厂模式属于创建型模式,其核心思想是通过工厂类(或方法)来创建对象,而不是直接在客户端代码中使用 new 关键字来实例化对象。通过这种方式,工厂模式将对象的创建过程封装起来,减少了系统中直接依赖具体类的情况,从而使得系统在扩展时更加灵活。


2. 工厂模式的分类

工厂模式可以分为三种常见的形式:

  • 简单工厂模式(Simple Factory):通过一个工厂类来实例化不同类型的对象。
  • 工厂方法模式(Factory Method):通过子类来决定具体创建哪个类的实例。
  • 抽象工厂模式(Abstract Factory):提供一个接口,用来创建相关或依赖对象的家族。

我们下面将重点介绍简单工厂模式和工厂方法模式。


2.1 简单工厂模式

假设我们有一个场景,需要根据用户的选择创建不同类型的汽车。我们可以使用简单工厂模式来实现这一功能。

首先,定义一个产品接口或抽象类,表示所有产品的公共方法。

java 复制代码
public interface Car {
    void drive();
}

然后,实现具体的汽车类。

bash 复制代码
public class SedanCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶轿车");
    }
}

public class SUVCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶SUV");
    }
}

接下来,创建一个工厂类,根据参数决定创建哪种类型的汽车。

java 复制代码
public class CarFactory {
    public static Car createCar(String type) {
        if ("sedan".equals(type)) {
            return new SedanCar();
        } else if ("suv".equals(type)) {
            return new SUVCar();
        } else {
            throw new IllegalArgumentException("未知的汽车类型");
        }
    }
}

最后,在客户端代码中使用工厂类来创建汽车对象。

java 复制代码
public class Client {
    public static void main(String[] args) {
        Car sedan = CarFactory.createCar("sedan");
        sedan.drive();

        Car suv = CarFactory.createCar("suv");
        suv.drive();
    }
}

简单工厂模式通过一个 CarFactory 类来决定创建具体的 Car 实现类。在客户端代码中,我们只需要通过工厂类获取所需对象,而无需关心具体对象的创建过程。这种方式使得系统更具灵活性,客户端代码的耦合度也较低,适用于产品种类较少且不需要扩展的情况。


2.2 工厂方法模式

假设我们希望每个子类都能创建自己的产品,可以使用工厂方法模式。

同样,定义一个产品接口或抽象类。

java 复制代码
public interface Car {
    void drive();
}

实现具体的汽车类。

java 复制代码
public class SedanCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶轿车");
    }
}

public class SUVCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶SUV");
    }
}

定义一个工厂接口,声明创建产品的抽象方法。

java 复制代码
public interface CarFactory {
    Car createCar();
}

实现具体的工厂类,每个工厂类负责创建一种特定的产品。

java 复制代码
public class SedanCarFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new SedanCar();
    }
}

public class SUVCarFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new SUVCar();
    }
}

在客户端代码中使用工厂方法来创建汽车对象。

java 复制代码
public class Client {
    public static void main(String[] args) {
        CarFactory sedanFactory = new SedanCarFactory();
        Car sedan = sedanFactory.createCar();
        sedan.drive();

        CarFactory suvFactory = new SUVCarFactory();
        Car suv = suvFactory.createCar();
        suv.drive();
    }
}

工厂方法模式将对象的创建委托给具体的工厂类,而不是由客户端直接决定对象的创建方式。每个工厂类都负责创建一种特定类型的对象,这使得系统在扩展时可以灵活地添加新的产品类型,而无需修改现有的代码,适用于产品种类较多且需要扩展的情况。


3. 工厂模式的优缺点

优点:

  • 解耦:工厂模式通过抽象工厂类和具体实现类,将对象的创建与使用分离,从而减少了客户端对具体类的依赖。
  • 扩展性强:如果需要增加新的产品类型,只需添加一个新的具体产品类及相应的工厂类,而不需要修改现有的代码。
  • 单一职责:工厂类负责创建对象,符合单一职责原则,使得系统的设计更加清晰。

缺点:

  • 增加类的数量:工厂模式需要额外的工厂类和产品类,会导致系统中类的数量增加。
  • 复杂性增加:对于简单的对象创建,使用工厂模式可能会显得过于复杂。

4. 总结

工厂模式是一种常用的创建型设计模式,它通过将对象的创建过程封装到工厂类中,减少了客户端与具体类的耦合。通过使用工厂模式,我们可以更好地组织和管理对象的创建,提升代码的灵活性和可维护性。在实际开发中,工厂模式特别适合处理需要创建多个相似对象的场景,尤其是在产品种类较多、类的扩展较为频繁时,工厂模式显得尤为重要。

相关推荐
devlei2 小时前
从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
android·前端·后端
pshdhx_albert2 小时前
AI agent实现打字机效果
java·http·ai编程
沉鱼.443 小时前
第十二届题目
java·前端·算法
努力的小郑3 小时前
Canal 不难,难的是用好:从接入到治理
后端·mysql·性能优化
赫瑞4 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
Victor3564 小时前
MongoDB(87)如何使用GridFS?
后端
Victor3564 小时前
MongoDB(88)如何进行数据迁移?
后端
小红的布丁4 小时前
单线程 Redis 的高性能之道
redis·后端
GetcharZp4 小时前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
周末也要写八哥5 小时前
多进程和多线程的特点和区别
java·开发语言·jvm