1269 字
约 4 分钟
3
工厂设计模式(Factory Pattern)

工厂设计模式(Factory Pattern)

1. 什么是工厂模式?

工厂模式:将对象的创建过程交给一个统一的工厂管理,使用者不需要自己 new 对象,而是通过工厂获取需要的对象。

简单理解:

不让业务代码负责创建对象,而是把创建对象的逻辑集中到工厂中统一管理。


2. 为什么需要工厂模式?

如果没有工厂:

Circle circle = new Circle();

Rectangle rectangle = new Rectangle();

Square square = new Square();

业务代码需要知道:

  • 有哪些实现类
  • 如何创建对象
  • 创建对象需要哪些参数

当对象越来越多时:

业务代码

 ↓

创建 Circle

创建 Rectangle

创建 Square

创建其他实现类

会导致:

  • 创建逻辑分散
  • 代码耦合严重
  • 后续新增实现需要修改大量代码

使用工厂后:

业务代码

   |
   | 获取对象
   ↓

  工厂

   |
   | 根据需求创建
   ↓

具体对象

业务代码只需要关心:

我要什么对象。

不需要关心:

对象怎么创建。


3. Demo

定义接口

public interface Shape {

    void draw();

}

实现类

public class Circle implements Shape {

    @Override
    public void draw() {

        System.out.println("Drawing a circle");

    }
}
public class Rectangle implements Shape {

    @Override
    public void draw() {

        System.out.println("Drawing a rectangle");

    }
}
public class Square implements Shape {

    @Override
    public void draw() {

        System.out.println("Drawing a square");

    }
}

创建工厂

工厂负责根据用户需求创建对应对象:

public class ShapeFactory {


    public static final String CIRCLE = "CIRCLE";

    public static final String RECTANGLE = "RECTANGLE";

    public static final String SQUARE = "SQUARE";


    public static Shape getShape(String type) {


        switch(type){

            case CIRCLE:

                return new Circle();


            case RECTANGLE:

                return new Rectangle();


            case SQUARE:

                return new Square();


            default:

                return null;
        }

    }
}

使用工厂

业务代码:

public class Main {


    public static void main(String[] args) {


        Shape shape =
            ShapeFactory.getShape(
                ShapeFactory.CIRCLE
            );


        shape.draw();

    }

}

输出:

Drawing a circle

业务代码不需要:

new Circle();

只需要告诉工厂:

我要 Circle

4. 什么时候使用工厂模式?

判断标准:

当一个对象存在多个实现,并且未来可能扩展时,就适合使用工厂模式。

例如:

现在支持:

注册中心:

Nacos

Zookeeper

Eureka

序列化:

JSON

Hessian

Protobuf

如果业务代码直接创建:

new NacosRegistry();

new JsonSerializer();

那么代码会和具体实现绑定。

以后增加:

Consul注册中心

Kryo序列化

业务代码需要大量修改。

使用工厂:

业务代码

   |
   |
   ↓

RegistryFactory

   |
   |
   ↓

NacosRegistry

ZookeeperRegistry

EurekaRegistry

新增实现只需要:

  • 增加实现类
  • 修改工厂配置

业务代码无需变化。


5. 常见应用场景

① IOC 容器

Spring IOC 本质就是一个大型工厂。

例如:

UserService userService =
        applicationContext.getBean(
            "userService"
        );

看起来:

获取对象

实际上:

IOC容器

      |
      |
      ↓

根据beanName

      |
      |
      ↓

创建/获取对应Bean

IOC 容器维护:

beanName  ->  bean对象

这个 Map 本质上就是一个对象工厂。


② RPC 框架

RPC 中:

客户端需要:

  • 注册中心
  • 序列化方式
  • 负载均衡策略
  • 容错策略

例如:

注册中心:

Nacos

Zookeeper

序列化:

JSON

Protobuf

如果直接:

new JsonSerializer();

代码会和实现绑定。

使用工厂:

SerializerFactory

        |
        |
        ↓

JsonSerializer

ProtobufSerializer

根据配置选择:

serializer=json

自动创建:

JsonSerializer

③ 组件开发

在开发通用组件时,经常不知道用户最终使用哪一种实现。

例如:

重试组件:

RetryFactory

      |
      |
      ↓

FixedRetry

ExponentialRetry

RandomRetry

用户只需要:

Retry retry =
    RetryFactory.create("fixed");

组件内部负责对象创建。


6. 工厂模式通常和什么一起使用?

工厂模式很少单独出现。

工厂 + 单例

例如:

Spring Bean:

第一次创建对象

↓

缓存

↓

以后直接返回

避免重复创建。


工厂 + 策略模式

例如:

支付系统:

PaymentFactory

        |
        |
        ↓

支付宝策略

微信策略

银行卡策略

工厂负责:

选择哪个对象。

策略负责:

对象具体执行逻辑。


7. 总结

工厂模式解决的问题:

对象太多,不希望业务代码直接创建和管理对象。

核心思想:

业务代码

    ↓

   工厂

    ↓

具体对象

使用场景:

  • 一个接口多个实现
  • 对象创建复杂
  • 需要根据配置动态选择对象
  • 未来可能扩展新的实现

一句话总结:

工厂模式就是把对象创建过程集中管理,让业务代码只关注使用对象,而不用关心对象如何创建。

工厂设计模式(Factory Pattern)
http://clxhxhhr.top/posts/377/
作者
clxstart
发布于
2026-09-01
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。