This repository contains my coursework and notes for the course Oblikovni obrasci u programiranju (Design Patterns in Programming), FER 2024/2025.
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.
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
- 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.
The labs are the practical backbone of the course.
Each lab focuses on applying design principles and patterns in increasingly complex contexts:
- Low-level polymorphism in C – function pointers, vtables, and runtime behavior.
- Object-oriented design in C++ – classes, templates, operator overloading.
- 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.
- Highlight: Lab 3 – Task 2.2
- 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.
- Highlight: Lab 4 – Custom Paint Application
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.
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.