# tawratnibir/online-examination-design-patterns architecture

> Architecture diagram of the GitHub repository tawratnibir/online-examination-design-patterns, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/tawratnibir/online-examination-design-patterns
- Repository: https://github.com/tawratnibir/online-examination-design-patterns

## Overview

1. **Project type and runtime**
   - This is a **plain Java console application** with no external frameworks, databases, or build tooling.
   - The runtime entry point is `app.Main`, which orchestrates object creation and prints the final exam dashboard to stdout.

2. **Top-level architecture**
   - The system is split into four main boundaries:
     - `configuration` for exam settings
     - `exam` for exam domain types
     - `question` for question abstractions and concrete families
     - `source` for where questions come from
   - The design is intentionally pattern-heavy, using **Builder**, **Factory Method**, **Abstract Factory**, and a simple **dependency injection / IoC** style for question sourcing.

3. **Configuration subsystem**
   - `configuration.ExamBuilder` builds `configuration.ExamConfiguration`.
   - `ExamConfiguration` is immutable and holds exam metadata such as title, duration, passing score, negative marking, shuffling, calculator permission, and auto-submit behavior.
   - This subsystem is independent of question generation; it defines the exam’s policy and presentation parameters.

4. **Exam domain and Factory Method**
   - `exam.Exam` is the shared exam abstraction.
   - `MidtermExam`, `FinalExam`, and `PracticeQuiz` are concrete exam types.
   - `exam.factory.ExamFactory` is the base factory method layer, with subclasses `MidtermExamFactory`, `FinalExamFactory`, and `PracticeQuizFactory`.
   - The exam factory boundary decides **which exam type** to instantiate, while the rest of the system supplies configuration and questions.

5. **Question abstraction layer**
   - `question.Question` is the common question model interface/base type.
   - Supporting contracts include:
     - `QuestionFactory` for creation
     - `QuestionRenderer` for display formatting
     - `QuestionEvaluator` for scoring/answer checking
     - `QuestionType` for categorization
   - This layer isolates the exam system from the details of any particular question family.

6. **Abstract Factory for question families**
   - Concrete question families live in subpackages:
     - `question.mcq`
     - `question.essay`
     - `question.programming`
     - `question.truefalse`
   - Each family typically contains four roles:
     - a question data class, e.g. `MCQQuestion`
     - a factory, e.g. `MCQFactory`
     - a renderer, e.g. `MCQRenderer`
     - an evaluator, e.g. `MCQEvaluator`
   - The factory acts as the family entry point, creating consistent question objects tied to the right renderer/evaluator behavior.

7. **Question source as a dependency boundary**
   - `source.QuestionSource` abstracts where question content comes from.
   - Implementations are:
     - `BankQuestionSource` for built-in curated questions
     - `FakerQuestionSource` for generated synthetic questions
     - `ManualQuestionSource` for directly supplied questions
   - `QuestionBank` and `QuestionFaker` support the source implementations.
   - Factories receive a `QuestionSource` instance, which decouples question creation from data origin.

8. **How the pieces connect at runtime**
   - `Main` chooses an exam factory, creates an exam instance, builds configuration, and selects a question source.
   - The exam factory provides the exam shell.
   - Question factories use the injected source to create concrete questions of the appropriate family.
   - The resulting `Question` objects are assembled into the exam and then rendered as a dashboard.

9. **Concrete demo flow in this repository**
   - The current sample flow creates a **MidtermExam**.
   - It uses **BankQuestionSource**.
   - It composes a mixed set of question families: MCQ, MCQ, Essay, Programming, and True/False.
   - It applies a configuration with title, timing, passing score, and runtime flags such as negative marking, shuffle, calculator access, and auto-submit.

10. **Important architectural boundaries for a diagram**
   - Keep `app.Main` as the top orchestration node.
   - Show `configuration` as a separate immutable settings path feeding the exam.
   - Show `exam.factory` as the exam-type selection layer.
   - Show `question` as the abstraction layer, with four concrete family branches.
   - Show `source` as an injected dependency into question factories, not a direct dependency of `Main` on question internals.
   - The key direction of dependencies is: **Main → factories/configuration → exam/question objects → rendering/output**.

Main entry points: [`src/app/Main.java`](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/app/Main.java) (Main), [`src/question/mcq/MCQFactory.java`](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/mcq/MCQFactory.java) (MCQ Factory), [`src/question/essay/EssayFactory.java`](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/essay/EssayFactory.java) (Essay Factory), [`src/question/QuestionType.java`](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/QuestionType.java) (Question Type)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App"]
  node_app_main["Main<br/>entrypoint<br/>[Main.java]"]
end

subgraph group_config["Configuration"]
  node_config_builder["Exam Builder<br/>[ExamBuilder.java]"]
  node_config_model["Exam Config<br/>immutable settings"]
end

subgraph group_exam["Exam"]
  node_exam_base["Exam<br/>domain abstraction<br/>[Exam.java]"]
  node_exam_factory_base["Exam Factory<br/>factory method<br/>[ExamFactory.java]"]
  node_exam_factory_midterm["Midterm Factory<br/>exam factory"]
  node_exam_factory_final["Final Factory<br/>exam factory"]
  node_exam_factory_practice["Practice Factory<br/>exam factory"]
  node_exam_midterm["Midterm Exam<br/>concrete exam<br/>[MidtermExam.java]"]
  node_exam_final["Final Exam<br/>concrete exam<br/>[FinalExam.java]"]
  node_exam_practice["Practice Quiz<br/>concrete exam<br/>[PracticeQuiz.java]"]
end

subgraph group_question["Question"]
  node_q_base["Question<br/>[Question.java]"]
  node_q_factory["Question Factory<br/>abstract factory"]
  node_q_renderer["Renderer<br/>presentation contract"]
  node_q_evaluator["Evaluator<br/>scoring contract"]
  node_q_type(("Question Type<br/>categorization<br/>[QuestionType.java]"))
  node_q_mcq["MCQ<br/>question family<br/>[MCQQuestion.java]"]
  node_q_essay["Essay<br/>question family<br/>[EssayQuestion.java]"]
  node_q_prog["Programming<br/>question family"]
  node_q_tf["True/False<br/>question family"]
  node_q_mcq_factory["MCQ Factory<br/>family factory<br/>[MCQFactory.java]"]
  node_q_mcq_renderer["MCQ Renderer<br/>[MCQRenderer.java]"]
  node_q_mcq_evaluator["MCQ Evaluator<br/>[MCQEvaluator.java]"]
  node_q_essay_factory["Essay Factory<br/>family factory<br/>[EssayFactory.java]"]
  node_q_essay_renderer["Essay Renderer<br/>[EssayRenderer.java]"]
  node_q_essay_evaluator["Essay Evaluator"]
  node_q_prog_factory["Prog Factory<br/>family factory"]
  node_q_prog_renderer["Prog Renderer"]
end

subgraph group_source["Source"]
  node_source_base["Question Source<br/>source abstraction"]
  node_source_bank["Bank Source<br/>curated source"]
  node_source_faker["Faker Source<br/>generated source"]
  node_source_manual["Manual Source<br/>supplied source"]
  node_source_bank_data[("Question Bank<br/>content store<br/>[QuestionBank.java]")]
  node_source_faker_data["Question Faker<br/>generator<br/>[QuestionFaker.java]"]
end

node_app_main -->|"builds"| node_config_builder
node_config_builder -->|"creates"| node_config_model
node_app_main -->|"selects"| node_exam_factory_midterm
node_app_main -->|"chooses"| node_source_bank
node_exam_factory_base -.->|"abstracts"| node_exam_base
node_exam_factory_midterm -->|"creates"| node_exam_midterm
node_exam_factory_final -->|"creates"| node_exam_final
node_exam_factory_practice -->|"creates"| node_exam_practice
node_app_main -->|"uses"| node_exam_factory_base
node_app_main -->|"applies"| node_config_model
node_app_main -->|"assembles"| node_q_mcq_factory
node_app_main -->|"assembles"| node_q_essay_factory
node_app_main -->|"assembles"| node_q_prog_factory
node_app_main -->|"assembles"| node_q_tf
node_q_factory -.->|"creates"| node_q_base
node_q_factory -.->|"injects"| node_source_base
node_source_bank -->|"implements"| node_source_base
node_source_faker -->|"implements"| node_source_base
node_source_manual -->|"implements"| node_source_base
node_source_bank -->|"reads"| node_source_bank_data
node_source_faker -->|"uses"| node_source_faker_data
node_q_mcq_factory -->|"creates"| node_q_mcq
node_q_mcq_factory -->|"pairs"| node_q_mcq_renderer
node_q_mcq_factory -->|"pairs"| node_q_mcq_evaluator
node_q_essay_factory -->|"creates"| node_q_essay
node_q_essay_factory -->|"pairs"| node_q_essay_renderer
node_q_essay_factory -->|"pairs"| node_q_essay_evaluator
node_q_prog_factory -->|"creates"| node_q_prog
node_q_prog_factory -->|"pairs"| node_q_prog_renderer
node_q_tf -.->|"classified by"| node_q_type
node_q_mcq -.->|"classified by"| node_q_type
node_q_essay -.->|"classified by"| node_q_type
node_q_prog -.->|"classified by"| node_q_type

click node_app_main "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/app/Main.java"
click node_config_builder "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/configuration/ExamBuilder.java"
click node_config_model "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/configuration/ExamConfiguration.java"
click node_exam_base "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/Exam.java"
click node_exam_factory_base "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/factory/ExamFactory.java"
click node_exam_factory_midterm "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/factory/MidtermExamFactory.java"
click node_exam_factory_final "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/factory/FinalExamFactory.java"
click node_exam_factory_practice "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/factory/PracticeQuizFactory.java"
click node_exam_midterm "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/MidtermExam.java"
click node_exam_final "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/FinalExam.java"
click node_exam_practice "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/PracticeQuiz.java"
click node_q_base "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/Question.java"
click node_q_factory "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/QuestionFactory.java"
click node_q_renderer "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/QuestionRenderer.java"
click node_q_evaluator "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/QuestionEvaluator.java"
click node_q_type "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/QuestionType.java"
click node_q_mcq "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/mcq/MCQQuestion.java"
click node_q_essay "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/essay/EssayQuestion.java"
click node_q_prog "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/programming/ProgrammingQuestion.java"
click node_q_tf "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/truefalse/TrueFalseQuestion.java"
click node_source_base "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/QuestionSource.java"
click node_source_bank "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/BankQuestionSource.java"
click node_source_faker "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/FakerQuestionSource.java"
click node_source_manual "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/ManualQuestionSource.java"
click node_source_bank_data "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/QuestionBank.java"
click node_source_faker_data "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/QuestionFaker.java"
click node_q_mcq_factory "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/mcq/MCQFactory.java"
click node_q_mcq_renderer "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/mcq/MCQRenderer.java"
click node_q_mcq_evaluator "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/mcq/MCQEvaluator.java"
click node_q_essay_factory "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/essay/EssayFactory.java"
click node_q_essay_renderer "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/essay/EssayRenderer.java"
click node_q_essay_evaluator "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/essay/EssayEvaluator.java"
click node_q_prog_factory "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/programming/ProgrammingFactory.java"
click node_q_prog_renderer "https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/programming/ProgrammingRenderer.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app_main toneBlue
class node_config_builder,node_config_model toneAmber
class node_exam_base,node_exam_factory_base,node_exam_factory_midterm,node_exam_factory_final,node_exam_factory_practice,node_exam_midterm,node_exam_final,node_exam_practice toneMint
class node_q_base,node_q_factory,node_q_renderer,node_q_evaluator,node_q_type,node_q_mcq,node_q_essay,node_q_prog,node_q_tf,node_q_mcq_factory,node_q_mcq_renderer,node_q_mcq_evaluator,node_q_essay_factory,node_q_essay_renderer,node_q_essay_evaluator,node_q_prog_factory,node_q_prog_renderer toneRose
class node_source_base,node_source_bank,node_source_faker,node_source_manual,node_source_bank_data,node_source_faker_data toneIndigo
```

## Components

### App

Runtime entrypoint and orchestration

- [Main](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/app/Main.java): entrypoint · Console entrypoint that assembles the exam flow · `src/app/Main.java`

### Configuration

Immutable exam settings

- [Exam Builder](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/configuration/ExamBuilder.java): builder · Builds exam configuration objects · `src/configuration/ExamBuilder.java`
- [Exam Config](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/configuration/ExamConfiguration.java): immutable settings · Immutable exam metadata and runtime policy · `src/configuration/ExamConfiguration.java`

### Exam

Exam domain and factory method layer

- [Exam](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/Exam.java): domain abstraction · Shared exam model · `src/exam/Exam.java`
- [Exam Factory](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/factory/ExamFactory.java): factory method · Base factory for choosing exam variants · `src/exam/factory/ExamFactory.java`
- [Midterm Factory](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/factory/MidtermExamFactory.java): exam factory · Creates midterm exams · `src/exam/factory/MidtermExamFactory.java`
- [Final Factory](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/factory/FinalExamFactory.java): exam factory · Creates final exams · `src/exam/factory/FinalExamFactory.java`
- [Practice Factory](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/factory/PracticeQuizFactory.java): exam factory · Creates practice quizzes · `src/exam/factory/PracticeQuizFactory.java`
- [Midterm Exam](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/MidtermExam.java): concrete exam · Midterm exam variant · `src/exam/MidtermExam.java`
- [Final Exam](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/FinalExam.java): concrete exam · Final exam variant · `src/exam/FinalExam.java`
- [Practice Quiz](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/exam/PracticeQuiz.java): concrete exam · Practice quiz variant · `src/exam/PracticeQuiz.java`

### Question

Shared question abstractions and concrete families

- [Question](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/Question.java): question abstraction · Common question contract · `src/question/Question.java`
- [Question Factory](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/QuestionFactory.java): abstract factory · Family-level question creation contract · `src/question/QuestionFactory.java`
- [Renderer](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/QuestionRenderer.java): presentation contract · Formats questions for display · `src/question/QuestionRenderer.java`
- [Evaluator](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/QuestionEvaluator.java): scoring contract · Checks answers and scores questions · `src/question/QuestionEvaluator.java`
- [Question Type](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/QuestionType.java): categorization · Question classification enum or tag · `src/question/QuestionType.java`
- [MCQ](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/mcq/MCQQuestion.java): question family · Multiple choice questions and behaviors · `src/question/mcq/MCQQuestion.java`
- [Essay](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/essay/EssayQuestion.java): question family · Essay questions and behaviors · `src/question/essay/EssayQuestion.java`
- [Programming](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/programming/ProgrammingQuestion.java): question family · Programming questions and behaviors · `src/question/programming/ProgrammingQuestion.java`
- [True/False](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/truefalse/TrueFalseQuestion.java): question family · True/false questions and behaviors · `src/question/truefalse/TrueFalseQuestion.java`
- [MCQ Factory](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/mcq/MCQFactory.java): family factory · Creates MCQ questions · `src/question/mcq/MCQFactory.java`
- [MCQ Renderer](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/mcq/MCQRenderer.java): renderer · Renders MCQ questions · `src/question/mcq/MCQRenderer.java`
- [MCQ Evaluator](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/mcq/MCQEvaluator.java): evaluator · Scores MCQ questions · `src/question/mcq/MCQEvaluator.java`
- [Essay Factory](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/essay/EssayFactory.java): family factory · Creates essay questions · `src/question/essay/EssayFactory.java`
- [Essay Renderer](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/essay/EssayRenderer.java): renderer · Renders essay questions · `src/question/essay/EssayRenderer.java`
- [Essay Evaluator](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/essay/EssayEvaluator.java): evaluator · Scores essay questions · `src/question/essay/EssayEvaluator.java`
- [Prog Factory](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/programming/ProgrammingFactory.java): family factory · Creates programming questions · `src/question/programming/ProgrammingFactory.java`
- [Prog Renderer](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/question/programming/ProgrammingRenderer.java): renderer · Renders programming questions · `src/question/programming/ProgrammingRenderer.java`

### Source

Question origin and content providers

- [Question Source](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/QuestionSource.java): source abstraction · Abstracts where question content comes from · `src/source/QuestionSource.java`
- [Bank Source](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/BankQuestionSource.java): curated source · Built-in curated question source · `src/source/BankQuestionSource.java`
- [Faker Source](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/FakerQuestionSource.java): generated source · Synthetic question source · `src/source/FakerQuestionSource.java`
- [Manual Source](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/ManualQuestionSource.java): supplied source · Directly supplied question source · `src/source/ManualQuestionSource.java`
- [Question Bank](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/QuestionBank.java): content store · Curated bank backing the bank source · `src/source/QuestionBank.java`
- [Question Faker](https://github.com/tawratnibir/online-examination-design-patterns/blob/main/src/source/QuestionFaker.java): generator · Synthetic content generator backing the faker source · `src/source/QuestionFaker.java`

## Connections

- Main → Exam Builder: builds · Main builds the exam settings
- Exam Builder → Exam Config: creates · Builder produces immutable configuration
- Main → Midterm Factory: selects · Main chooses the exam variant factory
- Main → Bank Source: chooses · Main selects the question source
- Exam Factory → Exam: abstracts · Factory method layer targets the shared exam type
- Midterm Factory → Midterm Exam: creates · Midterm factory instantiates midterm exam
- Final Factory → Final Exam: creates · Final factory instantiates final exam
- Practice Factory → Practice Quiz: creates · Practice factory instantiates practice quiz
- Main → Exam Factory: uses · Main orchestrates exam creation through the factory layer
- Main → Exam Config: applies · Configuration feeds exam setup
- Main → MCQ Factory: assembles · Main composes question families into the exam
- Main → Essay Factory: assembles · Main composes question families into the exam
- Main → Prog Factory: assembles · Main composes question families into the exam
- Main → True/False: assembles · Main composes question families into the exam
- Question Factory → Question: creates · Question factory contract produces shared question objects
- Question Factory → Question Source: injects · Factories depend on an abstract question source
- Bank Source → Question Source: implements · Curated source conforms to source abstraction
- Faker Source → Question Source: implements · Generated source conforms to source abstraction
- Manual Source → Question Source: implements · Manual source conforms to source abstraction
- Bank Source → Question Bank: reads · Bank source draws from the curated bank
- Faker Source → Question Faker: uses · Faker source uses generator support
- MCQ Factory → MCQ: creates · MCQ factory builds MCQ questions
- MCQ Factory → MCQ Renderer: pairs · MCQ family binds to its renderer
- MCQ Factory → MCQ Evaluator: pairs · MCQ family binds to its evaluator
- Essay Factory → Essay: creates · Essay factory builds essay questions
- Essay Factory → Essay Renderer: pairs · Essay family binds to its renderer
- Essay Factory → Essay Evaluator: pairs · Essay family binds to its evaluator
- Prog Factory → Programming: creates · Programming factory builds programming questions
- Prog Factory → Prog Renderer: pairs · Programming family binds to its renderer
- True/False → Question Type: classified by · True/false questions are one question type
- MCQ → Question Type: classified by · MCQ questions are one question type
- Essay → Question Type: classified by · Essay questions are one question type
- Programming → Question Type: classified by · Programming questions are one question type
