工厂模式是什么?
它定义了一个用于创建对象的接口,并允许子类决定实例化哪个类。
优点和缺点
- 即使你事先不知道要创建哪个类,工厂类也会负责创建对象。
- 对象的数据类型由其子类确定 → 易于扩展性
- 最小化冗余
为什么使用工厂模式?
因为面向对象设计模式的基本原则是它们应该对扩展开放,对修改关闭。 (OCP, 开闭原则) 应该能够扩展或更改模块的功能而不修改代码。
何时使用工厂模式?
_为了抽象化,有时接口或抽象类有多个实现。_在这种情况下,我们使用一个工厂类来找出要使用哪个实现。
示例
有两种类型的优惠券:积分积累优惠券和邮票积累优惠券。
ServiceImpl 必须根据所请求的优惠券类型进行调用。
CouponType
在这种情况下,你可以使用类似以下的工厂类
ServiceFactory
然后,控制器将使用服务工厂来查找并使用实现。但是,这种情况下会出现一些问题,如果有新的优惠券类型,你将需要修改工厂类。
ServiceFactory
维护将变得困难,并违反了OCP原则
- OCP: (开闭原则)软件实体 (类、模块、函数等) 应该对扩展开放,对修改关闭.
解决问题
实现 FactoryClass,使其在添加服务时不更改
PointCouponServiceImpl
创建一个使用 CouponType 返回 true 或 false 的方法
工厂类实现如下:
ServiceFactory
如果有多个实现,你可以将其作为 List 接收。
CouponController
这样,每次添加新的优惠券服务时都不必修改 FactoryClass。
使用缓存
在上述情况下,当存在许多相同的请求时,它的行为效率低下。 它首先在内存中扫描以找到实现,如果在完整列表中找不到它,则不会找到它。
ServiceFactory
- 在
Map<CouponType, CouponService>
中查找服务 - 如果找到服务,
return service
- 如果在
couponFactoryCache
中找不到匹配的服务,请在完整的优惠券列表中查找并将其放入couponFactoryCache
,然后返回服务
评论(0)