04 原型模式
定义:用来创建重复对象的模式(针对较为复杂的对象,通过克隆的方式节省时间)
理解:原型模式就是通过复制的方式创建新对象的,但是有时候可能出现高层次的需求,要求复制的对象经过某些特别的处理再出厂,可以把这些处理封装在复制的过程中,对外界屏蔽再处理细节
示例场景:
场景S:创建考试AB卷
目标T:同一场考试,为了防止作弊,需要设计AB卷分发给不同的考生,要求不同考生拿到的试卷题目相同,但是题序和答案都经过乱序处理
行动A:为了保证不同试卷的题目相同,因此需要一份源试卷对象
QuestionBank
作为母版,生产商QuestionBankController
调用createPaper(candidate, number)
方法通过克隆的方式生产同考场其他卷子,同时将乱序处理逻辑封装进克隆函数之中,即可实现AB卷制作
具体地,试卷类QuestionBank
实现Cloneable
接口的clone()
函数,将克隆试卷、题目乱序、答案乱序等操作集成到里面,即可对外屏蔽乱序细节。其中,题目乱序通过对储存题目的List
做shuffle()
实现;而答案乱序将选择题包装为Topic
对象,再调用TopicRandomUtils
做乱序处理实现
注意!傅哥他又在代码里加了建造者模式用来创建母版试卷,因为母版试卷可以看成是由多个选择题和问答题组装而成
- 结果S:
- 改造的想法
Topic
和ChoiceQuestion
实际上具有很强的关联性,可以将Topic
定义为一个接口(接口里定义random()
方法),然后ChoiceQuestion
实现Topic
接口,同时在random()
方法中写入答案乱序的处理逻辑
- 改造的想法