Master technical and career interviews with structured answers—short definition, real examples, pitfalls, and how to answer in 60–90 seconds.
In a graphical user interface (GUI) system, the Mediator Pattern can be used to manage interactions between various components like buttons, text fields, and labels. For example, clicking a button might update a text fie…
Answer: Instead of having complex direct interactions between objects (users in this case), the mediator simplifies the process, as objects only need to communicate with the mediator. What interviewers expect A clear def…
Answer: Users don’t need to know the identities of other users or how to reach them. The mediator centralizes communication, and the users only rely on the mediator to send and receive messages. Benefits of the Mediator…
The ChatMediator class is the concrete mediator that implements IChatMediator. It manages a list of users and is responsible for broadcasting messages to all registered users, except the one who sent the message. The med…
For very large collections, optimizing the iterator to handle bulk operations efficiently (e.g., lazy loading or batching) can improve performance. Visual Diagram: Follow: +---------------------------+ | IIterator<T&g…
When querying a database, the results often come back in the form of a collection (like a list of rows). The Iterator Pattern is used to iterate over these rows to access the data, rather than exposing the internal struc…
The Iterator Pattern allows the collection’s internal structure to be hidden from the client. The client interacts only with the iterator, which means that changes to the underlying collection (e.g., changing it from a l…
The IAggregate<T> interface defines a method CreateIterator() that returns an iterator instance. Any class that represents a collection should implement this interface to provide an iterator. public interface IAggr…
Answer: The Interpreter Pattern can be extended to support more complex grammars. For example, adding new operations like subtraction or division can be easily done by introducing new non-terminal expressions (e.g., Subt…
The Interpreter Pattern is commonly used in building parsers for domain-specific languages (DSLs) or simple programming languages. Each statement or expression in the language can be represented as an object, and the int…
Answer: New operations (e.g., subtraction, multiplication, etc.) can be added easily by creating new non-terminal expression classes (e.g., Subtract, Multiply). This makes the pattern highly extendable. What interviewers…
Answer: The Number class is a terminal expression that holds a single value. When the Interpret method is called, it returns the value of the number. Terminal expressions represent the simplest elements in the language o…
The Flyweight Pattern could be extended to support composite objects where each flyweight can contain references to other flyweights. For example, a complex character (e.g., with styling information) could consist of sev…
Answer: GUI frameworks that display multiple similar graphical elements (e.g., buttons, labels, icons) can use the Flyweight Pattern to reuse common elements while only storing the unique aspects (such as position, text,…
When the program requests a Character for each letter in the string "Hello World", the CharacterFactory checks if the character already exists. If it does, the existing object is reused; otherwise, a new Character object…
Answer: The factory manages the extrinsic state (e.g., the position where the character is rendered) separately. It ensures that intrinsic state (the symbol) is shared between all instances, preventing the creation of du…
Instead of directly instantiating the factory within the client code, you could use dependency injection to pass the correct factory implementation into the client code. This would make the code even more flexible and te…
A document generation system might have different types of document formats, such as PDF, Word, or HTML. A Factory Method can be used to create the appropriate document generator based on user input, allowing for flexibl…
Answer: The ILogger interface is implemented by the concrete classes FileLogger and ConsoleLogger. These classes define how the log message will be handled, either by writing to a file or outputting to the console. What…
Follow: These classes implement the ILogger interface, defining how the messages are logged (either to a file or the console). FileLogger: public class FileLogger : ILogger public void Log(string message) => Console.W…
The facade can be enhanced with better exception handling. For example, if a component fails (e.g., DVD player is missing), the facade could display a user-friendly message or take an appropriate action. Visual Diagram:…
A Facade Pattern can be used in financial systems where complex operations like credit checks, account updates, and transaction processing are abstracted into a simplified process, allowing users to perform transactions…
Answer: The Facade makes the system more readable. If the subsystem's complexity changes, the facade can be updated without affecting the client code. What interviewers expect A clear definition tied to GoF Patterns in G…
The Facade Pattern enables the user to work with a single entry point (i.e., the HomeTheaterFacade), which internally delegates tasks to the complex subsystem classes. This makes the system much easier to use while hidin…
The Facade class simplifies interactions with the subsystem by providing a unified interface for the user. It wraps the complex subsystem and provides higher-level methods that internally call the appropriate subsystem m…
Gang of Four Patterns Design Patterns in C# · GoF Patterns
to manage interactions between various components like buttons, text fields,
and labels. For example, clicking a button might update a text field, and the
mediator ensures that these updates are propagated correctly.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Answer: Instead of having complex direct interactions between objects (users in this case), the mediator simplifies the process, as objects only need to communicate with the mediator.
In a production Gang of Four Patterns application, teams apply this when handling user-facing features or integration boundaries. For example, you might use it during a sprint where reliability and observability matter—logging metrics, validating edge cases, and documenting the decision in an ADR so future developers understand why the approach was chosen.
Tip: Practice aloud on Toolliyo mock interview or the Interview Q&A section before your real interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Answer: Users don’t need to know the identities of other users or how to reach them. The mediator centralizes communication, and the users only rely on the mediator to send and receive messages. Benefits of the Mediator Pattern:
In a production Gang of Four Patterns application, teams apply this when handling user-facing features or integration boundaries. For example, you might use it during a sprint where reliability and observability matter—logging metrics, validating edge cases, and documenting the decision in an ADR so future developers understand why the approach was chosen.
Tip: Practice aloud on Toolliyo mock interview or the Interview Q&A section before your real interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
IChatMediator. It manages a list of users and is responsible for
broadcasting messages to all registered users, except the one who sent the
message.
to know about each other's existence.
public class ChatMediator : IChatMediator
{
private readonly List<User> _users = new List<User>();
public void RegisterUser(User user) => _users.Add(user);
public void SendMessage(string message, User user)
{
foreach (var u in _users)
{
// Message should not be sent to the user who sent it
if (u != user)
{
u.Receive(message);
}
}
}
}Gang of Four Patterns Design Patterns in C# · GoF Patterns
efficiently (e.g., lazy loading or batching) can improve performance.
Visual Diagram:
Follow:
+---------------------------+
| IIterator<T> |
| (Iterator Interface) |
+---------------------------+
+---------------------------+
| |
+-----------------+ +------------------+
| ProductIterator| | ProductCollection|
| (Concrete Iterator) | (Concrete Aggregate)|
+-----------------+ +------------------+
| |
+--------------+ +--------------+
| HasNext() | | Add() |
| Next() | | Count |
| | | CreateIterator() |
+--------------+ +--------------+
Conclusion:
The Iterator Pattern is a powerful design pattern for accessing elements of a collection
sequentially, encapsulating the iteration logic in a separate object. This allows for greater
flexibility and maintainability by decoupling the collection's internal representation from the
client code.
Mediator Pattern: Real-Time Example - Chat Application
Definition:
The Mediator Pattern defines an object that encapsulates how a set of objects interact. It
promotes loose coupling by preventing objects from referring to each other explicitly,
allowing them to communicate indirectly through the mediator. This pattern is useful when
you need to manage complex interactions between multiple objects, without them needing to
know about each other.
Use Case:
Follow:
A chat application is a perfect example of where the Mediator Pattern can be applied. In a
chat app, users (colleagues) need to communicate, but rather than each user being directly
aware of the others, a mediator handles all the communication between users.
Code Explanation:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
collection (like a list of rows). The Iterator Pattern is used to iterate over
these rows to access the data, rather than exposing the internal structure of
how the data is retrieved from the database.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
from the client. The client interacts only with the iterator, which means that
changes to the underlying collection (e.g., changing it from a list to a linked
list) do not affect the client code.Gang of Four Patterns Design Patterns in C# · GoF Patterns
returns an iterator instance. Any class that represents a collection should
implement this interface to provide an iterator.
public interface IAggregate<T>
{
IIterator<T> CreateIterator();
}Gang of Four Patterns Design Patterns in C# · GoF Patterns
Answer: The Interpreter Pattern can be extended to support more complex grammars. For example, adding new operations like subtraction or division can be easily done by introducing new non-terminal expressions (e.g., Subtract, Divide).
In a production Gang of Four Patterns application, teams apply this when handling user-facing features or integration boundaries. For example, you might use it during a sprint where reliability and observability matter—logging metrics, validating edge cases, and documenting the decision in an ADR so future developers understand why the approach was chosen.
Tip: Practice aloud on Toolliyo mock interview or the Interview Q&A section before your real interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
domain-specific languages (DSLs) or simple programming languages. Each
statement or expression in the language can be represented as an object,
and the interpreter evaluates these statements to execute the program.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Answer: New operations (e.g., subtraction, multiplication, etc.) can be added easily by creating new non-terminal expression classes (e.g., Subtract, Multiply). This makes the pattern highly extendable.
In a production Gang of Four Patterns application, teams apply this when handling user-facing features or integration boundaries. For example, you might use it during a sprint where reliability and observability matter—logging metrics, validating edge cases, and documenting the decision in an ADR so future developers understand why the approach was chosen.
Tip: Practice aloud on Toolliyo mock interview or the Interview Q&A section before your real interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Answer: The Number class is a terminal expression that holds a single value. When the Interpret method is called, it returns the value of the number. Terminal expressions represent the simplest elements in the language or grammar.
In a production Gang of Four Patterns application, teams apply this when handling user-facing features or integration boundaries. For example, you might use it during a sprint where reliability and observability matter—logging metrics, validating edge cases, and documenting the decision in an ADR so future developers understand why the approach was chosen.
Tip: Practice aloud on Toolliyo mock interview or the Interview Q&A section before your real interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
where each flyweight can contain references to other flyweights. For example,
a complex character (e.g., with styling information) could consist of several
flyweight components (like the base character, font style, size, etc.).
Visual Diagram:
+---------------------------+
| CharacterFactory |
| (Flyweight Factory) |
+---------------------------+
+---------------------------------------------+
| |
+------------------+
+------------------+
| Character | | Character
| <--- Flyweight Objects
| (Intrinsic State)| | (Intrinsic
State)|
+------------------+
+------------------+
| |
| * Shared across all objects |
Follow:
+--------------------------------------------------->+
(Position, Size, Text displayed are external/unique)
(Memory saved by sharing the intrinsic state)
Conclusion:
The Flyweight Pattern provides a powerful way to manage large numbers of similar objects
efficiently by sharing common state and minimizing memory usage. It’s particularly beneficial
in scenarios like text rendering, game graphics, or large-scale simulations where creating
numerous identical objects would be costly in terms of memory and performance. By
applying this pattern, you can significantly reduce the memory footprint and improve the
performance of your application while maintaining flexibility in managing the objects' unique
properties.
Interpreter Pattern: Real-Time Example - Parsing and Evaluating
Mathematical Expressions
Definition:
The Interpreter Pattern defines a representation for a grammar along with an interpreter to
interpret sentences in that grammar. It is used to evaluate expressions or interpret complex
languages by breaking them down into simpler components that can be recursively
evaluated.
Use Case:
A typical use case for the Interpreter Pattern is parsing and evaluating mathematical
expressions, like addition, subtraction, multiplication, or division. It allows for flexible and
dynamic evaluation of complex expressions.
Code Explanation:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Answer: GUI frameworks that display multiple similar graphical elements (e.g., buttons, labels, icons) can use the Flyweight Pattern to reuse common elements while only storing the unique aspects (such as position, text, or color).
In a production Gang of Four Patterns application, teams apply this when handling user-facing features or integration boundaries. For example, you might use it during a sprint where reliability and observability matter—logging metrics, validating edge cases, and documenting the decision in an ADR so future developers understand why the approach was chosen.
Tip: Practice aloud on Toolliyo mock interview or the Interview Q&A section before your real interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
World", the CharacterFactory checks if the character already exists. If it
does, the existing object is reused; otherwise, a new Character object is
created.
common objects.
Key Benefits of the Flyweight Pattern:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Answer: The factory manages the extrinsic state (e.g., the position where the character is rendered) separately. It ensures that intrinsic state (the symbol) is shared between all instances, preventing the creation of duplicate objects.
In a production Gang of Four Patterns application, teams apply this when handling user-facing features or integration boundaries. For example, you might use it during a sprint where reliability and observability matter—logging metrics, validating edge cases, and documenting the decision in an ADR so future developers understand why the approach was chosen.
Tip: Practice aloud on Toolliyo mock interview or the Interview Q&A section before your real interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
use dependency injection to pass the correct factory implementation into
the client code. This would make the code even more flexible and testable.
Visual Diagram:
+---------------------+
| LoggerFactory | <--- Abstract Factory
(Factory Method)
+---------------------+
+--------------------------+
| |
+-------------------+ +-------------------+
| FileLoggerFactory | | ConsoleLoggerFactory | <--- Concrete
Factories
+-------------------+ +-----------------------+
| |
+---------------+ +----------------+
| FileLogger | | ConsoleLogger | <--- Concrete
Products
Follow:
+---------------+ +----------------+
\ /
\ Client Code /
\_____________________/
Factory Interaction
factory (LoggerFactory), which then returns the appropriate logger (FileLogger
or ConsoleLogger).
Conclusion:
The Factory Method Pattern offers a flexible and extensible solution for object creation,
especially in scenarios where the type of object to be created is determined at runtime. It
decouples the client code from specific classes, making it easier to extend and maintain.
Whether it's for logging systems, database connections, or UI components, this pattern
allows developers to create objects in a controlled and predictable manner, improving
scalability and maintainability.
Flyweight Pattern: Real-Time Example - Managing Graphic Objects in a
Game
Definition:
The Flyweight Pattern is designed to reduce the cost of creating and manipulating a large
number of similar objects. By sharing common parts of an object between multiple instances,
it saves memory and improves performance.
Use Case:
A typical use case for the Flyweight Pattern is in applications like games or text editors
that need to handle a large number of similar objects. For example, in a game with many
characters displayed on the screen, each character might be similar but would take up
unnecessary memory if each instance stored its own version of a character object. The
Flyweight pattern can be used to share the common properties (like the character symbol)
and only store unique ones (like the position).
Code Explanation:
Follow:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
formats, such as PDF, Word, or HTML. A Factory Method can be used to
create the appropriate document generator based on user input, allowing for
flexible document creation without hardcoding the specific document format
classes.Gang of Four Patterns Design Patterns in C# · GoF Patterns
Answer: The ILogger interface is implemented by the concrete classes FileLogger and ConsoleLogger. These classes define how the log message will be handled, either by writing to a file or outputting to the console.
In a production Gang of Four Patterns application, teams apply this when handling user-facing features or integration boundaries. For example, you might use it during a sprint where reliability and observability matter—logging metrics, validating edge cases, and documenting the decision in an ADR so future developers understand why the approach was chosen.
Tip: Practice aloud on Toolliyo mock interview or the Interview Q&A section before your real interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Follow:
are logged (either to a file or the console).
FileLogger:
public class FileLogger : ILogger
public void Log(string message) => Console.WriteLine($"Logging
to file: {message}");
ConsoleLogger:
public class ConsoleLogger : ILogger
public void Log(string message) => Console.WriteLine($"Logging
to console: {message}");
Gang of Four Patterns Design Patterns in C# · GoF Patterns
component fails (e.g., DVD player is missing), the facade could display a
user-friendly message or take an appropriate action.
Visual Diagram:
+-------------------------------------+
| HomeTheaterFacade | <-- Facade
(Simplified Interface)
+-------------------------------------+
/ \
/ \
+---------------+ +---------------+
| Amplifier | | DVD Player | <-- Subsystem
Classes
+---------------+ +---------------+
| |
(turn on, play movie) (play movie, etc.)
EndMovie()) to the user.
desired result.
Conclusion:
Follow:
The Facade Pattern is highly effective for simplifying complex systems by providing a
unified interface. In the case of a home theater system, it reduces the complexity of
managing multiple components and makes the system more user-friendly. Whether it’s home
entertainment, e-commerce systems, or banking software, the Facade Pattern is a valuable
design pattern for hiding complexity and improving usability.
Factory Method Pattern: Real-Time Example - Logging Framework
Definition:
The Factory Method Pattern defines an interface for creating objects, but allows
subclasses to alter the type of objects that will be created. This provides flexibility in creating
different types of objects while adhering to the same interface.
Use Case:
A common use case for the Factory Method Pattern is in logging frameworks. Such
frameworks can log messages to various destinations, like files, databases, or consoles. The
Factory Method allows the system to choose the appropriate logging mechanism
dynamically, based on configuration or user preferences, without tightly coupling the client
code to specific classes.
Code Explanation:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
operations like credit checks, account updates, and transaction processing
are abstracted into a simplified process, allowing users to perform
transactions without understanding the underlying complexities.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Answer: The Facade makes the system more readable. If the subsystem's complexity changes, the facade can be updated without affecting the client code.
In a production Gang of Four Patterns application, teams apply this when handling user-facing features or integration boundaries. For example, you might use it during a sprint where reliability and observability matter—logging metrics, validating edge cases, and documenting the decision in an ADR so future developers understand why the approach was chosen.
Tip: Practice aloud on Toolliyo mock interview or the Interview Q&A section before your real interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
the HomeTheaterFacade), which internally delegates tasks to the complex
subsystem classes. This makes the system much easier to use while hiding
unnecessary complexity.
Key Benefits of the Facade Pattern:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
unified interface for the user. It wraps the complex subsystem and provides
higher-level methods that internally call the appropriate subsystem methods.
public class HomeTheaterFacade
{
private readonly Amplifier _amplifier;
private readonly DVDPlayer _dvdPlayer;
public HomeTheaterFacade(Amplifier amplifier, DVDPlayer
dvdPlayer)
{
_amplifier = amplifier;
_dvdPlayer = dvdPlayer;
}
public void WatchMovie(string movie)
{
_amplifier.On();
_dvdPlayer.Play(movie);
}
public void EndMovie()
{
_amplifier.Off();
}
}