首页
Preview

无需使用 if-else 的工厂模式

工厂模式是什么?

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

优点和缺点

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

为什么使用工厂模式?

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

何时使用工厂模式?

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

示例

有两种类型的优惠券:积分积累优惠券和邮票积累优惠券。

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

CouponType

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

ServiceFactory

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

ServiceFactory

维护将变得困难,并违反了OCP原则

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

解决问题

实现 FactoryClass,使其在添加服务时不更改

PointCouponServiceImpl

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

工厂类实现如下:

ServiceFactory

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

CouponController

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

使用缓存

在上述情况下,当存在许多相同的请求时,它的行为效率低下。 它首先在内存中扫描以找到实现,如果在完整列表中找不到它,则不会找到它。

ServiceFactory

  • Map<CouponType, CouponService> 中查找服务
  • 如果找到服务,return service
  • 如果在 couponFactoryCache 中找不到匹配的服务,请在完整的优惠券列表中查找并将其放入 couponFactoryCache,然后返回服务

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

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

评论(0)

添加评论