Skip to content

Coursework and labs for Design Patterns in Programming (OOUP, FER 2024/2025) – exploring object-oriented design, SOLID principles, and software design patterns through practical assignments.

Notifications You must be signed in to change notification settings

fran-galic/Design-Patterns

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Design Patterns in Programming (OOUP)

This repository contains my coursework and notes for the course Oblikovni obrasci u programiranju (Design Patterns in Programming), FER 2024/2025.


Course overview

The course focuses on principles of clean design, object-oriented abstractions, and design patterns for building robust, maintainable, and extensible software systems.
It explores both the theoretical background and practical applications of modern software design.


Learning outcomes

By the end of the course, I was able to:

  • Recognize symptoms of poor design: rigidity, fragility, needless complexity, and opacity.
  • Apply object-oriented abstractions: interfaces, inheritance, dynamic polymorphism.
  • Use generic programming techniques with C++ templates and Python’s implicit typing.
  • Understand the runtime and memory costs of abstraction mechanisms (e.g., vtables, object layout).
  • Apply SOLID principles to improve software architecture.
  • Implement and combine well-known design patterns:
    • Strategy, Observer, Singleton
    • Composite, Iterator, Prototype, Factory
    • State, Bridge, and others

Course structure

  • Lectures: cover theory, principles, and design patterns with examples in C, C++, and Python.
  • Laboratory exercises: hands-on practice in applying design patterns to build working systems.
  • Assignments: gradually progress from low-level polymorphism to advanced GUI applications with pattern-based architecture.

Laboratory exercises

The labs are the practical backbone of the course.
Each lab focuses on applying design principles and patterns in increasingly complex contexts:

  1. Low-level polymorphism in C – function pointers, vtables, and runtime behavior.
  2. Object-oriented design in C++ – classes, templates, operator overloading.
  3. Dynamic typing in Python – flexible abstractions and duck typing.
    • Highlight: Lab 3 – Task 2.2
      Here I built a well-organized system where everything runs smoothly inside my custom notepad application. This task required significant integration of concepts and stands out as one of the most challenging and rewarding parts of the course.
  4. Vector drawing program – a full application integrating multiple design patterns (Composite, State, Observer, Prototype, Factory, Bridge, etc.).
    • Highlight: Lab 4 – Custom Paint Application
      This lab was essentially building my own "Paint"-like software, combining multiple design patterns into a working GUI program. It represents the most complex and comprehensive assignment in the course.

Official lab instructions


Why this course matters

OOUP provides the foundation for building scalable and maintainable systems.
By learning to recognize design smells and apply proven patterns, I am able to create software that is:

  • easier to extend,
  • more robust against change, and
  • aligned with real-world engineering practices.

Summary

This repository documents my progress in learning object-oriented design and patterns through coursework, labs, and implementations.
It serves as a reference point for applying these principles in future projects and professional work.

About

Coursework and labs for Design Patterns in Programming (OOUP, FER 2024/2025) – exploring object-oriented design, SOLID principles, and software design patterns through practical assignments.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published