Design Patterns in Software Design

Course Description

The course addresses general principles and specific methods for designing flexible and modular software subsystems. A notion of a design pattern is introduced as a well known and tested solution to a recurring problem in a particular problem domain. The classifications of design patterns are considered, according to purpose, scope, and the level of abstraction, together with the corresponding representatives. It is assumed that the basic pieces of knowledge from the domain of object oriented programming have been acquired on the introductory courses.

General Competencies

Students are trained to apply key design principles in planned construction of high quality software subsystems. These information enable critical assessment of different solutions to the problem at hand in software design. The presented patterns offer an in-depth view onto common organizational challenges in software design, as well as a pragmatic insight into advantages of novel features of modern programming languages. By employing the acquired knowledge and practical experience, the students will be able to improve the organization of their software systems, as well as to clarify documentation through usage of established pattern terminology.

Learning Outcomes

  1. recognize symptoms of inadequate software design
  2. discuss advantages of dynamic polymorphism, templates, and duck typing
  3. explain the major principles of software design and recognize cases of their violation
  4. evaluate the quality of multiple software designs based key design principles
  5. recognize different design patterns in uncommented code
  6. select and apply appropriate design patterns in the construction of a software product
  7. compare the adequateness of different design patterns in the context of a given design problem
  8. apply design principles for conceiving high-quality software components

Forms of Teaching


The course includes two hours of lectures per week.


The knowledge tests include the midterm exam (40%), the final exam (40%) and tests in the laboratory (20%).


The course includes four auditory exercises.

Laboratory Work

The course includes four laboratory exercises.


Regular consultations will be held after each lecture. Ad-hoc consultations should be arranged by e-mail.


Students can earn additional credits by presenting a technical seminar.

Grading Method

Continuous Assessment Exam
Type Threshold Percent of Grade Threshold Percent of Grade
Laboratory Exercises 0 % 20 % 40 % 0 %
Mid Term Exam: Written 0 % 40 % 0 %
Final Exam: Written 0 % 40 %
Exam: Written 50 % 80 %
Exam: Oral 20 %

Week by Week Schedule

  1. Introduction: importance of software organization, goals of software design, review of development process models. Symptoms of inadequate software organization.
  2. Example: the loss of integrity due to changed requirements and the adaptation of the design to new conditions. Review of diagrams and programming concepts. Techniques for achieving flexible code in C, C++ and Python: dynamic and static polymorphism, duck typing.
  3. Principles of logical design: the Open-closed principle, and the Liskov substitution principle.
  4. Principles of logical design: the Dependency inversion principle, the Single responsibility principle, and the Interface segregation principle.
  5. Principles of physical design: the desired form of the component dependency graph, adequate stability and abstractness of packages.
  6. The design pattern concept illustrated on the Strategy pattern example. The Observer pattern.
  7. The Decorator pattern. Parameterized factory. Factories which do not depend on concrete types.
  8. Midterm exam.
  9. The Factory Method pattern. The Abstract factory pattern. The Singleton pattern.
  10. The Command pattern. The Adapter pattern. The Template method pattern.
  11. The Iterator pattern. The Composite pattern. The State pattern.
  12. The Proxy pattern. The Bridge pattern. The Visitor pattern.
  13. The Prototype pattern, the Model-View-Controller pattern.
  14. Rješavanje problema za vježbu.
  15. Final exam

Study Programmes

University undergraduate
Computer Engineering (module)
Elective Courses (6. semester)
Computer Science (module)
Elective Courses (6. semester)
Software Engineering and Information Systems (module)
Elective Courses (6. semester)



Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1995.), Design Patterns, Addison-Wesley Professional
Robert C. Martin (2002.), Agile Software Development: Principles, Patterns, and Practices, Prentice Hall
John Lakos (1996.), Large-Scale C++ Software Design, Addison-Wesley Professional
Andrei Alexandrescu (2001.), Modern C++ Design: Generic Programming and Design Patterns Applied, Addison-Wesley Professional


Laboratory exercises

Grading System

ID 86487
  Summer semester
L1 English Level
L1 e-Learning
30 Lecturers
0 Exercises
15 Laboratory exercises


89 Excellent
76 Very Good
63 Good
50 Acceptable