04 原型模式

  • 定义用来创建重复对象的模式(针对较为复杂的对象,通过克隆的方式节省时间)

  • 理解:原型模式就是通过复制的方式创建新对象的,但是有时候可能出现高层次的需求,要求复制的对象经过某些特别的处理再出厂,可以把这些处理封装在复制的过程中,对外界屏蔽再处理细节

  • 示例场景

    • 场景S:创建考试AB卷

    • 目标T:同一场考试,为了防止作弊,需要设计AB卷分发给不同的考生,要求不同考生拿到的试卷题目相同,但是题序和答案都经过乱序处理

    • 行动A:为了保证不同试卷的题目相同,因此需要一份源试卷对象QuestionBank作为母版,生产商QuestionBankController调用createPaper(candidate, number)方法通过克隆的方式生产同考场其他卷子,同时将乱序处理逻辑封装进克隆函数之中,即可实现AB卷制作


具体地,试卷类QuestionBank实现Cloneable接口的clone()函数,将克隆试卷、题目乱序、答案乱序等操作集成到里面,即可对外屏蔽乱序细节。其中,题目乱序通过对储存题目的Listshuffle()实现;而答案乱序将选择题包装为Topic对象,再调用TopicRandomUtils做乱序处理实现

注意!傅哥他又在代码里加了建造者模式用来创建母版试卷,因为母版试卷可以看成是由多个选择题和问答题组装而成

  • 结果S:
    04 原型模式 - 图1
    • 改造的想法
      TopicChoiceQuestion实际上具有很强的关联性,可以将Topic定义为一个接口(接口里定义random()方法),然后ChoiceQuestion实现Topic接口,同时在random()方法中写入答案乱序的处理逻辑

建造者模式-第 5 页.drawio.png