Master technical and career interviews with structured answers—short definition, real examples, pitfalls, and how to answer in 60–90 seconds.
Short answer: Clients don’t need to know about the specific classes that make up the subsystem. The facade hides this information, reducing dependencies and improving modularity. Real-Time Use Case Examples: Say this in…
Short answer: The Decorator Pattern can be used to extend the functionality of media streaming services. For example, you could decorate a base video stream to include ads, subtitles, or additional features like HD quali…
Short answer: The beauty of the Decorator Pattern is that new features (like milk or sugar) can be added dynamically, without changing the original SimpleCoffee class. You can stack decorators as needed, allowing for fle…
Short answer: Operations like searching for a file or calculating the total size of a directory could be added to the IFileSystemComponent interface and implemented by both files and directories. Explain a bit more Visua…
Short answer: The client code (in this case, the Program class) doesn’t need to worry about whether a component is a file or a directory. It can just call ShowInfo() on any component and let the pattern take care of the…
Short answer: The ShowInfo() method in Directory calls ShowInfo() on all its child components. This is where the recursive nature of the Composite Pattern comes into play. It doesn’t matter whether the child is a File or…
Short answer: The Command Pattern allows commands to be queued for execution, making it suitable for scenarios where requests need to be delayed or processed sequentially, such as in transaction management or job schedul…
Short answer: The pattern can be easily extended to include more handlers, which means it can scale well as the number of log levels (or other request types) grows. Explain a bit more Improvement Suggestions: Add More Lo…
Short answer: As your object construction logic becomes more complex (e.g., if more pizza types or ingredients are added), the Builder Pattern allows you to encapsulate that complexity in dedicated builder classes, which…
Short answer: You don’t need to re-implement the drawing logic for each new shape. Explain a bit more Instead, you can simply reuse the same drawing API for multiple shapes. Improvement Suggestions: Add More Shapes: To e…
Short answer: user interface. Visual Diagram: +------------------+ +-------------------+ | NewsPublisher |-------| NewsSubscriber | | (Subject) | | (Observer) | +------------------+ +-------------------+ | | | Subscribe/…
Short answer: And Bob. The subscribers are subscribed to the publisher. When the publisher sends out a notification (Notify()), all subscribers are automatically notified and updated with the latest news. class Program {…
Short answer: llows us to add additional behavior to the coffee object, but we don't modify the base class (SimpleCoffee). Explain a bit more public abstract class CoffeeDecorator : ICoffee { protected ICoffee _coffee; p…
Short answer: In GUI systems, UI components (like buttons or text boxes) can be considered observers that listen to changes or events (like button clicks) from a user interface. Explain a bit more Visual Diagram: +------…
Short answer: The User class represents a user in the chat application. Explain a bit more Each user has a name and a reference to the mediator. When a user wants to send a message, they call Send() on the mediator, whic…
Short answer: The Iterator Pattern provides a consistent and uniform way to access elements of the collection, regardless of the underlying structure of the collection. Real-Time Use Case Examples: Say this in the interv…
Short answer: The ProductIterator class is the concrete iterator that implements the IIterator<Product> interface. It holds a reference to the collection (ProductCollection) and provides the logic for iterating ove…
Short answer: The Add class represents a non-terminal expression that combines two other expressions (leftExpression and rightExpression). The Interpret method evaluates both sides of the expression and returns their sum…
Short answer: In the client code, we create a CharacterFactory instance to manage the characters. We then iterate over the text "Hello World", requesting a Character object for each character. The flyweight obj…
Short answer: This is an abstract class that declares the CreateLogger method, which is intended to return an ILogger instance. The actual instantiation is delegated to subclasses. public abstract class LoggerFactory Exa…
Short answer: The CoffeeDecorator class is an abstract class that implements the ICoffee interface and holds a reference to an ICoffee object. This class allows us to add additional behavior to the coffee object, but we…
Short answer: The Directory class represents the composite component in the tree structure. It can contain files or other directories. The Add() method is used to add components (both files and directories) to the direct…
Short answer: The Document class represents the receiver of the command. It contains the actual operations for adding and removing text from the document. The AddText and RemoveText methods manipulate the internal conten…
Short answer: The LogLevel enum defines the different types of log messages (e.g., Info, Error). public enum LogLevel { Info, Error } Say this in the interview Define — one clear sentence (the short answer above). Exampl…
Short answer: The MargheritaPizzaBuilder is a concrete implementation of the IPizzaBuilder interface. It builds a specific type of pizza (Margherita in this case) by setting the dough, sauce, and adding toppings. The Bui…
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: Clients don’t need to know about the specific classes that make up the subsystem. The facade hides this information, reducing dependencies and improving modularity. Real-Time Use Case Examples:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The Decorator Pattern can be used to extend the functionality of media streaming services. For example, you could decorate a base video stream to include ads, subtitles, or additional features like HD quality. Improvement Suggestions:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The beauty of the Decorator Pattern is that new features (like milk or sugar) can be added dynamically, without changing the original SimpleCoffee class. You can stack decorators as needed, allowing for flexible and extensible object behavior at runtime. Key Benefits of the Decorator Pattern:
Use a GoF pattern in ShopNest only when it removes duplication or makes a change safer—explain the problem it solves in the interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: Operations like searching for a file or calculating the total size of a directory could be added to the IFileSystemComponent interface and implemented by both files and directories.
Visual Diagram: Here's a simple visual diagram to understand the Composite Pattern: +----------------------+ | IFileSystemComponent | +----------------------+ / \ / \ +-----------+ +-----------+ | File | | Directory | +-----------+ +-----------+ / \ / \ +-----------+ +-----------+ | File | | Directory | +-----------+ +-----------+ File and Directory both implement IFileSystemComponent.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The client code (in this case, the Program class) doesn’t need to worry about whether a component is a file or a directory. It can just call ShowInfo() on any component and let the pattern take care of the rest. Real-Time Use Case Example:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The ShowInfo() method in Directory calls ShowInfo() on all its child components. This is where the recursive nature of the Composite Pattern comes into play. It doesn’t matter whether the child is a File or another Directory; both types implement the ShowInfo() method, and the directory simply iterates over its children. Key Benefits of the Composite Pattern:
Use a GoF pattern in ShopNest only when it removes duplication or makes a change safer—explain the problem it solves in the interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The Command Pattern allows commands to be queued for execution, making it suitable for scenarios where requests need to be delayed or processed sequentially, such as in transaction management or job scheduling. Improvement Suggestions:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The pattern can be easily extended to include more handlers, which means it can scale well as the number of log levels (or other request types) grows.
Improvement Suggestions: Add More Log Levels: You could add additional log levels such as Warning, Debug, or Fatal, each handled by its own specific logger. You would just need to create new concrete handlers for these levels. Logging to Different Destinations: Each logger could be extended to not just print to the console, but also log to files, databases, or remote servers. This way, the Chain of Responsibility could support more complex logging systems with different outputs for each level. Adding a Default Handler: If no handler in the chain can process a message, it might be useful to have a default handler (such as a DefaultLogger) that logs an unknown message or performs some fallback action. Real-Time Use Case
The Chain of Responsibility Pattern is often used in real-time systems like: Logging systems, where you need to handle messages at various levels (Info, Error, Warning). Event handling systems, where each handler deals with different types of events and either processes or passes them on. Request handling pipelines in web servers, where requests pass through multiple stages, and each stage processes the request in a specific way (e.g., authentication, authorization, logging, validation). Visual Diagram: Here’s a simple visual diagram to understand the Chain of Responsibility Pattern: +------------------+ | InfoLogger | <-- Handles LogLevel.Info +------------------+ +------------------+ | ErrorLogger | <-- Handles LogLevel.Error +------------------+ (End of Chain) The Chain of Responsibility Pattern is a powerful way to handle requests that need to be processed by multiple handlers, each responsible for a specific part of the process. It is especially useful when you have a sequence of operations (like logging, event handling, or request processing) that may vary based on context. Command Pattern: Real-Time Example - Undo Functionality in a Text Editor Scenario: In a text editor, you often need the ability to undo actions (like adding or removing text) to revert the document to its previous state. The Command Pattern is an excellent choice for implementing undo functionality. This pattern encapsulates requests as objects, allowing for parameterization of clients with queues, requests, and operations. It decouples the sender of the request from the object that processes the request, making it easier to manage actions and undo operations. Code Explanation:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: As your object construction logic becomes more complex (e.g., if more pizza types or ingredients are added), the Builder Pattern allows you to encapsulate that complexity in dedicated builder classes, which improves the maintainability of your codebase.
Improvement Suggestions: Additional Builders for Other Pizzas: You can extend the pattern by adding more concrete builder classes (e.g., PepperoniPizzaBuilder, VeggiePizzaBuilder) for different pizza variations, each with its own unique construction process. Customizing the Director Class: If you have different types of pizzas, you can modify the PizzaDirector to allow for different construction methods based on customer preferences (e.g., for large or family-sized pizzas). Adding More Ingredients: The Pizza class can be further extended to include more properties such as cheese, crust type, and size. The builder can then be updated to handle these new ingredients. Real-Time Use Case
The Builder Pattern is particularly useful in scenarios where objects have many optional parts or configurations. For instance: Building a customizable product like a pizza or burger where the customer can choose various toppings, sauces, and sizes. Constructing complex UI elements where the user can select different styles, colors, and components for a widget. Creating complex documents or reports that can have different layouts, sections, and contents. Visual Diagram: Here’s a simple visual diagram to understand the Builder Pattern: +------------------+ | PizzaDirector | +------------------+ +---------------------+ | IPizzaBuilder |<-------------+ +---------------------+ | | | +--------------------+-----------------+ +-------------------+ | | | | +------------------+ +-------------------+ +----------------+ +--------------------+ | MargheritaPizza | | PepperoniPizza | | Pizza | | PizzaDirector | | Builder | | Builder | | (Product) | | (Client) | +------------------+ +-------------------+ +----------------+ +--------------------+ The Builder Pattern allows you to manage the complexity of creating a customizable object (like a pizza) by breaking the process down into smaller, manageable steps. This pattern provides flexibility, scalability, and easier maintainability, especially when your objects grow more complex over time. Chain of Responsibility Pattern: Real-Time Example - Logging System with Multiple Levels Scenario: In a logging system, we may want to handle multiple levels of log messages like Info, Warning, and Error. Each log level can either process a log message or pass it along to the next level if it is not relevant to that level. The Chain of Responsibility Pattern is ideal for handling such cases, where multiple handlers are responsible for processing requests and can either handle the request or pass it on to the next handler in the chain. In this example, we will implement a simple logging system with different log levels (Info, Error), where each level can choose to handle the message or pass it along. Code Explanation:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: You don’t need to re-implement the drawing logic for each new shape.
Instead, you can simply reuse the same drawing API for multiple shapes. Improvement Suggestions: Add More Shapes: To extend the pattern, you can introduce additional shape classes like Rectangle or Triangle, and have them use the same drawing API to render their specific shapes. Introduce More Drawing APIs: As the application grows, you could add more concrete implementations of IDrawingAPI for different rendering libraries, allowing the user to select their preferred drawing style or technology. Performance Optimization: If your drawing application needs to optimize performance (e.g., when rendering complex or large scenes), you could implement caching strategies in your drawing APIs or leverage lazy initialization. Real-Time Use Case
The Bridge Pattern is particularly useful when building graphics software, drawing applications, or game engines where you may need to render shapes in various styles. For instance: A drawing application that supports multiple rendering backends (e.g., OpenGL, DirectX, or HTML Canvas). A game engine where you have various game objects (e.g., players, enemies) that need to be drawn using different rendering techniques. Visual Diagram: Here’s a simple visual diagram to understand the Bridge Pattern: Abstraction (Shape) --> IDrawingAPI (Implementation) | | v v Refined Abstraction (Circle) --> Concrete Implementations (DrawingAPI1, DrawingAPI2) Builder Pattern: Real-Time Example - Building a Custom Pizza Scenario: Imagine you're building a pizza ordering system that allows customers to customize their pizzas with different dough types, sauces, and toppings. The Builder Pattern is a perfect fit for such use cases where you need to create complex objects step by step, each with various configurations or options. The Builder Pattern separates the construction of an object from its representation. This means the same construction process can create different variations of an object. In this case, the pattern allows for building different types of pizzas (e.g., Margherita, Pepperoni, Veggie) with various ingredients. Code Explanation:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: user interface. Visual Diagram: +------------------+ +-------------------+ | NewsPublisher |-------| NewsSubscriber | | (Subject) | | (Observer) | +------------------+ +-------------------+ | | | Subscribe/Unsubscribe | Update v v +------------------+ +-------------------+ | NewsPublisher | | NewsSubscriber | | (Subject) |-------| (Observer)… |……… +------------------+ +-------------------+ Conclusion: The Observer…
Pattern is a powerful and flexible design pattern for building systems where objects need to be notified of changes to another object's state.
When order status changes, observers update email, SMS, and analytics without the Order class knowing each one.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: And Bob. The subscribers are subscribed to the publisher. When the publisher sends out a notification (Notify()), all subscribers are automatically notified and updated with the latest news. class Program { static void Main() { var publisher = new NewsPublisher(); var subscriber1 = new NewsSubscriber("Alice"); var subscriber2 = new… nd Bob. The subscribers…… are subscribed to the publisher. When the publisher sends…
out a notification (Notify()), all subscribers are automatically notified and updated with the latest news. class Program { static void Main() { var publisher = new NewsPublisher(); var subscriber1 = new NewsSubscriber("Alice"); var subscriber2 = new NewsSubscriber("Bob"); publisher.Subscribe(subscriber1); publisher.Subscribe(subscriber2); publisher.Notify("Breaking News: Observer Pattern in C#!"); } } Output: lice received news: Breaking News: Observer Pattern in C#! Bob received news: Breaking News: Observer Pattern in C#! How It Works: And Bob. The subscribers are subscribed to the publisher. When the publisher sends out a…
When order status changes, observers update email, SMS, and analytics without the Order class knowing each one.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: llows us to add additional behavior to the coffee object, but we don't modify the base class (SimpleCoffee).
public abstract class CoffeeDecorator : ICoffee { protected ICoffee _coffee; protected CoffeeDecorator(ICoffee coffee) => _coffee = coffee; public virtual double Cost() => _coffee.Cost(); public virtual string Description() => _coffee.Description(); } llows us to add additional behavior to the coffee object, but we don't modify the base class (SimpleCoffee). public abstract class CoffeeDecorator : ICoffee { protected ICoffee _coffee; protected CoffeeDecorator(ICoffee coffee) => _coffee = coffee; public virtual double Cost() => _coffee.Cost(); public virtual string Description() => _coffee.Description(); }
Logging and caching decorators wrap IProductRepository so core SQL code stays clean.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: In GUI systems, UI components (like buttons or text boxes) can be considered observers that listen to changes or events (like button clicks) from a user interface.
Visual Diagram: +------------------+ +-------------------+ | NewsPublisher |-------| NewsSubscriber | | (Subject) | | (Observer) | +------------------+ +-------------------+ | | | Subscribe/Unsubscribe | Update v v +------------------+ +-------------------+ | NewsPublisher | | NewsSubscriber | | (Subject) |-------| (Observer) | +------------------+ +-------------------+ Conclusion: The Observer Pattern is a powerful and flexible design pattern for building systems where objects need to be notified of changes to another object's state.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The User class represents a user in the chat application.
Each user has a name and a reference to the mediator. When a user wants to send a message, they call Send() on the mediator, which then sends the message to all other registered users. Users only interact with the mediator, and not with each other directly. public class User public void Send(string message) => _mediator.SendMessage(message, this); public void Receive(string message) => Console.WriteLine($"{_name} received: {message}"); }
{
private readonly string _name;
private readonly IChatMediator _mediator;
public User(string name, IChatMediator mediator)
{
_name = name;
_mediator = mediator; _mediator.RegisterUser(this); // Register the user with the mediator }
Use a GoF pattern in ShopNest only when it removes duplication or makes a change safer—explain the problem it solves in the interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The Iterator Pattern provides a consistent and uniform way to access elements of the collection, regardless of the underlying structure of the collection. Real-Time Use Case Examples:
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The ProductIterator class is the concrete iterator that implements the IIterator<Product> interface. It holds a reference to the collection (ProductCollection) and provides the logic for iterating over it, including HasNext() and Next() methods to navigate through the collection. public class ProductIterator : IIterator<Product>
{
private readonly ProductCollection _collection;
private int _current = 0;
public ProductIterator(ProductCollection collection) =>
_collection = collection;
public bool HasNext() => _current < _collection.Count;
public Product Next() => _collection[_current++];
}
Use a GoF pattern in ShopNest only when it removes duplication or makes a change safer—explain the problem it solves in the interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The Add class represents a non-terminal expression that combines two other expressions (leftExpression and rightExpression). The Interpret method evaluates both sides of the expression and returns their sum. public class Add : IExpression
{
private readonly IExpression _leftExpression;
private readonly IExpression _rightExpression;
public Add(IExpression left, IExpression right)
{
_leftExpression = left;
_rightExpression = right;
}
public int Interpret() => _leftExpression.Interpret() + _rightExpression.Interpret(); }
Use a GoF pattern in ShopNest only when it removes duplication or makes a change safer—explain the problem it solves in the interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: In the client code, we create a CharacterFactory instance to manage the characters. We then iterate over the text "Hello World", requesting a Character object for each character. The flyweight objects are reused, reducing memory consumption. class Program { static void Main() {
var factory = new CharacterFactory();
string text = "Hello World";
foreach (var c in text)
{
var character = factory.GetCharacter(c); character.Display(0, 0); // Simplified position for this example }
}
}
Use a GoF pattern in ShopNest only when it removes duplication or makes a change safer—explain the problem it solves in the interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: This is an abstract class that declares the CreateLogger method, which is intended to return an ILogger instance. The actual instantiation is delegated to subclasses. public abstract class LoggerFactory
{
public abstract ILogger CreateLogger();
}
ShopNest’s NotificationFactory creates Email or SMS senders based on user preference.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The CoffeeDecorator class is an abstract class that implements the ICoffee interface and holds a reference to an ICoffee object. This class allows us to add additional behavior to the coffee object, but we don't modify the base class (SimpleCoffee). public abstract class CoffeeDecorator : ICoffee
{ protected ICoffee _coffee; protected CoffeeDecorator(ICoffee coffee) => _coffee = coffee;
public virtual double Cost() => _coffee.Cost();
public virtual string Description() => _coffee.Description();
}
Logging and caching decorators wrap IProductRepository so core SQL code stays clean.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The Directory class represents the composite component in the tree structure. It can contain files or other directories. The Add() method is used to add components (both files and directories) to the directory. The ShowInfo() method iterates through its children and displays their information. public class Directory : IFileSystemComponent
{
private string _name;
private List<IFileSystemComponent> _children = new
List<IFileSystemComponent>();
public Directory(string name) => _name = name;
public void Add(IFileSystemComponent component) => _children.Add(component); public void ShowInfo()
{ Console.WriteLine($"Directory: {_name}"); foreach (var child in _children)
{ child.ShowInfo(); }
}
}
Use a GoF pattern in ShopNest only when it removes duplication or makes a change safer—explain the problem it solves in the interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The Document class represents the receiver of the command. It contains the actual operations for adding and removing text from the document. The AddText and RemoveText methods manipulate the internal content (a StringBuilder).
public class Document
{
private readonly StringBuilder _content = new StringBuilder();
public void AddText(string text) => _content.Append(text);
public void RemoveText(string text) => _content.Remove(_content.Length - text.Length, text.Length); public override string ToString() => _content.ToString();
}
Use a GoF pattern in ShopNest only when it removes duplication or makes a change safer—explain the problem it solves in the interview.
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The LogLevel enum defines the different types of log messages (e.g., Info, Error). public enum LogLevel { Info, Error }
Gang of Four Patterns Design Patterns in C# · GoF Patterns
Short answer: The MargheritaPizzaBuilder is a concrete implementation of the IPizzaBuilder interface. It builds a specific type of pizza (Margherita in this case) by setting the dough, sauce, and adding toppings. The Build() method returns the fully constructed pizza. public class MargheritaPizzaBuilder : IPizzaBuilder
{
private Pizza _pizza = new Pizza();
public void SetDough(string dough) => _pizza.Dough = dough;
public void SetSauce(string sauce) => _pizza.Sauce = sauce;
public void AddTopping(string topping) => _pizza.Toppings.Add(topping); public Pizza Build() => _pizza;
}
Use a GoF pattern in ShopNest only when it removes duplication or makes a change safer—explain the problem it solves in the interview.