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/ 评论
0 条
还没有评论,先写一条吧。