java-design第四节原型模式
创造者模式:工厂方法、抽象工厂、生成器、原型、单例
这类模式提供创建对象的机制,能够提升已有代码的灵活性和可复用性
第四节、原型模式
一、原型模式介绍
原型模式主要解决的问题就是创建重复对象,而这部分对象内容本身比较复杂,生成过程可能从库或者RPC接口中获取数据的耗时较长,因此采用克隆的方式节省时间。
二、案例场景模拟
公平性的考试需求
在保证大家的公平性一样的题目下,开始出现试题混排,正确的答案选项也混排
需要时间上机考试抽题的业务,因此在这里创建一个题库题目的场景类信息。创建:选择题,问答题。
1.场景模拟工程
在这里只模拟了两种题目,选择题和问答题。
2.场景简述
2.1 选择题
package org.levtio.demo.design; |
2.2 问答题
package org.levtio.demo.design; |
三、使用一个类实现
1.工程结构
2.代码实现
package org.levtio.demo.design; |
以上代码主要包含三部分,首先创建选择题和问答题到集合中,定义详情字符串包装结果、返回结果内容。
3.测试验证
编写测试类:
package org.levtio.demo.design.test; |
测试结果:
考生:lev |
四、原型模式重构代码
原型模式主要解决的问题就是创建大量重复的类
在原型模式中所需要的非常重要的手段就是克隆,在需要用到克隆的类中都需要实现implements Cloneable接口
1.工程结构
原型模式工程结构
原型模式模型结构
- 工程中包括了核心的题库类QuestionBank,题库中主要负责将各个的题目进行组装最终输出试卷。
- 针对每一个试卷都会使用克隆的方式进行复制,复制完成后将试卷中题目以及每个题目的答案进行乱序处理。
- 乱序功能使用工具包:TopicRandomUtil
2.代码实现
2.1题目选项乱序操作工具包
package org.levtio.demo.design.util; |
这个工具类的操作就是将原有Map中的选型乱序操作,也就是A的选项内容给B,B的可能给C,同事记录正确答案在处理后的位置信息。
2.2克隆对象处理类
package org.levtio.demo.design; |
这段代码的主要操作有三个,分别是:
- 两个**append()**,对各项题目的添加,有点像我们在建造者模式中使用的方式,添加装修物料。
- **clone()**,这里的核心操作就是对对象的复制,这里的肤质不只是包括了本身,同事对两个集合也做了复制。只有这样的拷贝才能确保操作克隆对象的时候不影响原对象。
- 乱序操作,在list集合中有一个方法Collections.shuffle,可以将原有集合的顺序打乱,输出一个新的顺序。
2.4初始化试卷数据
package org.levtio.demo.design; |
- 主要提供对试卷内容的模式初始化操作。
- 创建的时候使用克隆方式
3.测试验证
编写测试类:
package org.levtio.demo.design.test; |
测试结果:
考生:lev |
选择题乱排序功能也实现了。
五、总结
- 原型模式的使用频率不是很高。
- 优点:便于通过克隆方式创建复杂对象,也可以避免重复做初始化操作,不需要与类中所属的其他类耦合等。
- 缺点:如果对象中包括了循环引用的克隆,以及类中深度使用对象的克隆,都会使此模式变的异常麻烦
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LevBlog!