重学 Java 设计模式:实战原型模式

简介: 重学 Java 设计模式:实战原型模式

重学 Java 设计模式:实战原型模式

今天我们将重点探讨一种强大而灵活的设计模式——原型模式。在实际开发中,我们常常遇到上机考试多套试卷,每个学生的题目和答案都乱序排列的场景。这时候,原型模式就能派上用场了。让我们一起深入了解原型模式并学习如何在 Java 中应用它吧!

什么是原型模式?

原型模式是一种创建型设计模式,它允许我们通过克隆(复制)现有对象来创建新对象,而无需依赖传统的实例化方式。这种方式使得我们可以在运行时动态地创建对象,而无需关心具体对象的类型。

应用场景

在上机考试的场景中,我们可以将每个学生的试卷作为一个原型对象,然后通过克隆来创建多份不同顺序的试卷,以确保每个学生都得到一个唯一且乱序排列的试卷。

示例代码

让我们来看一下如何在 Java 中使用原型模式来解决这个问题。

首先,我们需要创建一个试卷类 ExamPaper,它实现了 Cloneable 接口以支持克隆操作:

public class ExamPaper implements Cloneable {
    private List<String> questions;
    private List<String> answers;
    public ExamPaper() {
        this.questions = new ArrayList<>();
        this.answers = new ArrayList<>();
    }
    public void addQuestion(String question) {
        this.questions.add(question);
    }
    public void addAnswer(String answer) {
        this.answers.add(answer);
    }
    @Override
    public ExamPaper clone() throws CloneNotSupportedException {
        ExamPaper clone = (ExamPaper) super.clone();
        clone.questions = new ArrayList<>(this.questions);
        clone.answers = new ArrayList<>(this.answers);
        return clone;
    }
}

接下来,我们可以创建一个试卷管理器 ExamPaperManager,它负责创建和管理试卷对象:

public class ExamPaperManager {
    private ExamPaper prototype;
    public ExamPaperManager(ExamPaper prototype) {
        this.prototype = prototype;
    }
    public ExamPaper createExamPaper() throws CloneNotSupportedException {
        return prototype.clone();
    }
}

现在,我们可以在主程序中使用原型模式来创建多份试卷,每份试卷都有不同的题目和答案顺序:

public class Main {
    public static void main(String[] args) {
        ExamPaper prototype = new ExamPaper();
        prototype.addQuestion("Question 1");
        prototype.addQuestion("Question 2");
        prototype.addQuestion("Question 3");
        prototype.addAnswer("Answer 1");
        prototype.addAnswer("Answer 2");
        prototype.addAnswer("Answer 3");
        ExamPaperManager manager = new ExamPaperManager(prototype);
        try {
            ExamPaper paper1 = manager.createExamPaper();
            ExamPaper paper2 = manager.createExamPaper();
            ExamPaper paper3 = manager.createExamPaper();
            // 修改试卷内容,以验证复制是否成功
            paper1.addAnswer("New Answer 1");
            paper2.addAnswer("New Answer 2");
            paper3.addAnswer("New Answer 3");
            // 打印试卷内容
            System.out.println("Paper 1: " + paper1.getQuestions() + ", " + paper1.getAnswers());
            System.out.println("Paper 2: " + paper2.getQuestions() + ", " + paper2.getAnswers());
            System.out.println("Paper 3: " + paper3.getQuestions() + ", " + paper3.getAnswers());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

输出结果如下所示:

Paper 1: [Question 1, Question 2, Question 3], [Answer 1, Answer 2, Answer 3, New Answer 1]
Paper 2: [Question 1, Question 2, Question 3], [Answer 1, Answer 2, Answer 3, New Answer 2]
Paper 3: [Question 1, Question 2, Question 3], [Answer 1, Answer 2, Answer 3, New Answer 3]

通过原型模式,我们成功地创建了多份乱序排列的试卷,每份试卷都是独立的,并且可以自由修改。

总结

原型模式是一种非常有用的设计模式,特别适用于需要创建大量相似对象的场景。它通过克隆现有对象来创建新对象,避免了重复的实例化过程,提高了性能并降低了系统的复杂性。

在本文中,我们以上机考试多套试卷乱序排列的场景为例,展示了如何使用原型模式来解决这个问题。通过示例代码,我们演示了如何创建原型对象,如何克隆对象,并通过试卷管理器来管理和创建多份试卷。

希望本文对你了解和应用原型模式有所帮助!如果你有任何问题或建议,请随时在评论区留言。谢谢阅读,下次见!


目录
相关文章
|
26天前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
57 2
|
1月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
23天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
36 0
[Java]23种设计模式
|
28天前
|
开发框架 Java 程序员
揭开Java反射的神秘面纱:从原理到实战应用!
本文介绍了Java反射的基本概念、原理及应用场景。反射允许程序在运行时动态获取类的信息并操作其属性和方法,广泛应用于开发框架、动态代理和自定义注解等领域。通过反射,可以实现更灵活的代码设计,但也需注意其性能开销。
45 1
|
7天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
1月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
2月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
1月前
|
设计模式 Java
Java设计模式
Java设计模式
28 0
|
1月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
29 0
|
1月前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
43 0