You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
## 介绍
|
|
|
|
|
工厂模式的主要意图是定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
|
|
|
|
|
简单说就是为了提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑。让外部可以更加简单的调用即可。也是消除if-else方式之一。
|
|
|
|
|
|
|
|
|
|
## 代码例子
|
|
|
|
|
|
|
|
|
|
场景:用户抽象后获得积分,使用积分可以兑换奖品。奖品分为3类:兑换卡、实物奖品、优惠卷
|
|
|
|
|
### 1. 一坨代码
|
|
|
|
|
可以使用if-else实现,通过判断奖品类型,实现不同奖品兑换
|
|
|
|
|
![[Snipaste_2023-02-10_21-23-21.png]]
|
|
|
|
|
缺点:后续人员接手会变得十分痛苦,并且重构成本高。
|
|
|
|
|
### 2.用工厂模式改造
|
|
|
|
|
![[Snipaste_2023-02-10_21-25-01.png]]
|
|
|
|
|
|
|
|
|
|
1. 定义奖品接口
|
|
|
|
|
![[Snipaste_2023-02-10_21-26-16.png]]
|
|
|
|
|
2. 实现该接口
|
|
|
|
|
![[Snipaste_2023-02-10_21-26-59.png]]
|
|
|
|
|
3. 构建奖品工厂类
|
|
|
|
|
![[Snipaste_2023-02-10_21-27-35.png]]
|
|
|
|
|
|
|
|
|
|
**可以用Map来代替工厂类,比如构建Map<Integer,ICommidity>将3类实现放到map中,key为奖品类型代码**
|
|
|
|
|
|
|
|
|
|
## 优点
|
|
|
|
|
避免创建者与具体的逻辑耦合、满足单一职责,每一个业务逻辑实现都在自己的类中完成、满足开闭原则,无需更改使用调用方法就可以在程序中引入新的产品类型
|
|
|
|
|
|
|
|
|
|
## 缺点
|
|
|
|
|
如果有非常多的类型,那么实现的子类也会很多,因此需要使用其他模式进行优化
|