首页
Preview

无 if-else 的工厂模式

工厂模式是什么?

它定义了一个创建对象的接口,并允许子类决定实例化哪个类。

优缺点

  • 即使你不知道要创建哪个类,工厂类也会负责创建对象。
  • 对象的数据类型由其子类决定 → 易于扩展性
  • 最小化冗余

为什么使用工厂模式?

因为面向对象设计模式的基本原则是它们应该对扩展开放,对修改关闭。 (OCP,开放封闭原则)。它应该可以扩展或更改模块的功能而无需修改代码。

何时使用工厂模式?

出于抽象的考虑,有时一个接口或抽象类有多个实现。在这种情况下,我们使用一个工厂类来找出要使用哪个实现。

示例

有两种类型的优惠券:积分积累优惠券和印章积累优惠券。

ServiceImpl 必须根据请求的优惠券类型进行调用。

CouponType

在这种情况下,你可以使用像这样的工厂类

ServiceFactory

然后,控制器将使用服务工厂来查找和使用实现。但是,这种情况下会出现一些问题,如果你有一个新的 CouponType,你将需要修改你的工厂类**。**

ServiceFactory

维护将会很困难,而且 OCP 原则将被违反

  • OCP: (开闭原则) 软件实体 (类、模块、函数等) 应该对扩展开放,对修改关闭。

问题解决

实现了 FactoryClass 不改变甚至在添加服务时。

PointCouponServiceImpl

创建一个使用 CouponType 返回 true 或 false 的方法。

工厂类实现如下:

ServiceFactory

如果有多个实现,你可以将其作为列表接收。

CouponController

这样,每次添加新的优惠券服务时,你就不必修改 FactoryClass

使用缓存

在上述情况下,当有许多相同的请求时,它的行为效率低下。

它首先 扫描内存 以查找实现,如果在 完整列表中 找不到它。

ServiceFactory

  • Map<CouponType,CouponService> 中查找服务。
  • 如果找到服务,则 返回服务
  • 如果 couponFactoryCache 中没有匹配的服务,则在完整的优惠券列表中查找它并将其放入 couponFactoryCache,并返回服务。

译自:https://medium.com/@Seonggil/factorypattern-without-if-else-d3b36463d4c0

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论