工厂模式是什么?
它定义了一个创建对象的接口,并允许子类决定实例化哪个类。
优缺点
- 即使你不知道要创建哪个类,工厂类也会负责创建对象。
- 对象的数据类型由其子类决定 → 易于扩展性
- 最小化冗余
为什么使用工厂模式?
因为面向对象设计模式的基本原则是它们应该对扩展开放,对修改关闭。 (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
评论(0)