Design Patterns

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.

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. compare the adequateness of different design patterns in the context of a given design problem
  7. apply design principles for conceiving high-quality software components

Forms of Teaching


The course does not include lectures in English.


The course includes four laboratory exercises.

Grading Method

Continuous Assessment Exam
Type Threshold Percent of Grade Threshold Percent of Grade
Laboratory Exercises 40 % 20 % 50 % 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. Static and dynamic properties of software. Significance of inter-component interaction and software organization. Basics of development process.
  2. Symptops of inadequate organization. Relation between requirements and organizational entropy. OMT class diagrams. Diagrams of physical organization.
  3. Techniques for expressing flexible programs. Dybamic polymorphism in C++, C and Python. Static polymorphism in C++. Object oriented design. Design by contract. Resource acquisition is initialization.
  4. Logical design principles: open-closed principle, Liskov substitution principle, dependency-inversion principle, single responsibility principle, interface segregation principle. Physical design principles: test-driven design, incremental testing, levelization, cyclic dependencies.
  5. Design patterns. Strategy. Template method. Observer.
  6. Decorator. Command
  7. Exercises.
  8. Midterm exam
  9. Generic factories. Singleton. Iterator.
  10. Adapter. Composite. State.
  11. Proxy. Bridge.
  12. Prototype. Visitor.
  13. Factory method. Model - view - controller.
  14. Exercises.
  15. Final exam

Study Programmes

University undergraduate
[FER3-EN] Computing - study
Elective Courses (6. semester)
[FER3-EN] Electrical Engineering and Information Technology - study
Elective Courses (6. semester)


Erich Gamma, Richard Helm (Computer scientist), Ralph E. Johnson, John Vlissides (1995.), Design Patterns,
Robert C. Martin, Jan M. Rabaey, Anantha P. Chandrakasan, Borivoje Nikolić (2003.), Agile Software Development, Pearson

For students


ID 210749
  Summer semester
L1 English Level
L1 e-Learning
30 Lectures
0 Seminar
15 Exercises
8 Laboratory exercises
0 Project laboratory

Grading System

89 Excellent
76 Very Good
63 Good
50 Acceptable