ScholarQuill logoScholarQuillUniversity Notes
  • Notes
  • Past Papers
  • Blogs
  • Todo
Login
ScholarQuill logoScholarQuillUniversity Notes
Login
NotesPast PapersBlogsTodo
More
SubjectsDiscussionCGPA CalculatorGPA CalculatorStudent PortalCourse Outline
About
About usPrivacy PolicyReportContact
Notes
Past Papers
Blogs
Todo
Analytics
    Current Subject
    🧩
    Software Engineering
    CC-212
    Progress0 / 25 topics
    Topics
    1. Nature of Software2. Overview of Software Engineering3. Professional software development4. Software engineering practice5. Software process structure6. Software process models7. Agile software Development8. Agile process models9. Agile development techniques10. Requirements engineering process11. Functional and non-functional requirements12. Context models13. Interaction models14. Structural models15. Behavioral models16. Model driven engineering17. Architectural design18. Design and implementation19. UML diagrams20. Design patterns21. Software testing and quality assurance22. Software evolution23. Project management and project planning24. Configuration management25. Software Process improvement
    CC-212›Design patterns
    Software EngineeringTopic 20 of 25

    Design patterns

    11 minread
    1,832words
    Intermediatelevel

    Design Patterns in Software Engineering

    A design pattern is a general repeatable solution to a commonly occurring problem in software design. Design patterns are templates or best practices that can be applied to solve specific design problems in object-oriented software systems. They are not specific to a particular programming language or framework but rather provide a universal, reusable solution to software design challenges.

    Design patterns were introduced by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides (the "Gang of Four") in their influential book Design Patterns: Elements of Reusable Object-Oriented Software (1994). These patterns help software developers create flexible, maintainable, and scalable systems.

    Categories of Design Patterns

    Design patterns are typically divided into three main categories based on their purpose:

    1. Creational Patterns: These patterns deal with the process of object creation and abstract the instantiation process to make a system independent of how its objects are created.
    2. Structural Patterns: These patterns focus on how classes and objects are composed to form larger structures, ensuring that structures are easy to manage and maintain.
    3. Behavioral Patterns: These patterns deal with communication between objects and how they interact with each other, focusing on the flow of control and responsibility.

    1. Creational Patterns

    Creational patterns abstract the instantiation process, allowing the system to be independent of how its objects are created. They provide a way to manage object creation in different situations, making the code more flexible and adaptable.

    1. Singleton Pattern:

      • Problem: Ensures that a class has only one instance and provides a global point of access to that instance.
      • Solution: The Singleton pattern ensures that a class has only one instance and provides a global access point to that instance. This is useful for managing shared resources (e.g., database connections).
      • Example: A logging service where only one instance should exist.
    2. Factory Method Pattern:

      • Problem: Defines an interface for creating objects but allows subclasses to alter the type of objects that will be created.
      • Solution: This pattern defines a method for creating an object, but it allows subclasses to change the type of object that will be created. It is used when a class can't anticipate the class of objects it must create.
      • Example: A class that needs to create different types of documents (e.g., Word or PDF) but delegates the creation logic to subclasses.
    3. Abstract Factory Pattern:

      • Problem: Provides an interface for creating families of related or dependent objects without specifying their concrete classes.
      • Solution: An abstract factory pattern provides a way to create a group of related objects without specifying their concrete classes. It often involves multiple factory methods for creating different types of objects.
      • Example: A user interface library that can generate different UI elements based on the operating system (Windows, macOS, Linux).
    4. Builder Pattern:

      • Problem: Separates the construction of a complex object from its representation so that the same construction process can create different representations.
      • Solution: The Builder pattern allows the construction process to create a complex object step by step. The object is constructed incrementally, and the builder can produce different representations of the object.
      • Example: Constructing a Car object with various options (engine type, color, etc.) using a CarBuilder class.
    5. Prototype Pattern:

      • Problem: Specifies the kind of objects to create using a prototypical instance and creates new objects by copying this prototype.
      • Solution: The Prototype pattern creates new objects by cloning an existing object, thus eliminating the need to know the concrete class of the object being created.
      • Example: A document editor where you can duplicate existing documents to create new ones based on an existing template.

    2. Structural Patterns

    Structural patterns deal with object composition and provide ways to organize and structure relationships between classes and objects.

    1. Adapter Pattern:

      • Problem: Allows incompatible interfaces to work together by providing a wrapper that translates between the two.
      • Solution: The Adapter pattern converts the interface of a class into another interface that the client expects. It helps make classes work together that couldn’t otherwise because of incompatible interfaces.
      • Example: Adapting a USB interface to a SerialPort interface so that the two can communicate.
    2. Bridge Pattern:

      • Problem: Decouples an abstraction from its implementation so that both can vary independently.
      • Solution: The Bridge pattern separates the abstraction (interface) and the implementation (concrete class). This allows the abstraction to change independently from the implementation, and vice versa.
      • Example: In a graphics application, the Shape class can have different implementations (like Circle, Square) and different renderers (like OpenGL, DirectX), allowing you to change the renderer without affecting the shape logic.
    3. Composite Pattern:

      • Problem: Composes objects into tree-like structures to represent part-whole hierarchies.
      • Solution: The Composite pattern treats individual objects and compositions of objects uniformly. This allows you to create complex tree structures with both leaf and composite nodes.
      • Example: A file system structure where both files and directories (which may contain files) are treated as a common object.
    4. Decorator Pattern:

      • Problem: Dynamically adds responsibilities to an object without modifying its code.
      • Solution: The Decorator pattern attaches additional responsibilities to an object at runtime without affecting other objects of the same class.
      • Example: A text editor where you can dynamically apply different styles (bold, italics) to text.
    5. Facade Pattern:

      • Problem: Provides a simplified interface to a complex subsystem.
      • Solution: The Facade pattern provides a higher-level interface that makes a subsystem easier to use. It hides the complexities of the system and provides a simple interface for the client.
      • Example: A home theater system where the Facade class simplifies interactions with multiple subsystems (e.g., sound system, projector, DVD player).
    6. Flyweight Pattern:

      • Problem: Reduces the memory usage by sharing common data across many objects, instead of storing duplicate data for each object.
      • Solution: The Flyweight pattern stores shared data externally, allowing objects to share common state and reduce memory consumption.
      • Example: A word processor that stores font information globally rather than storing it with each character.
    7. Proxy Pattern:

      • Problem: Provides a surrogate or placeholder for another object to control access to it.
      • Solution: The Proxy pattern involves using a proxy object that controls access to another object, providing a level of indirection.
      • Example: A network proxy that provides access to a remote object by handling network communication.

    3. Behavioral Patterns

    Behavioral patterns are concerned with how objects communicate and collaborate with each other.

    1. Chain of Responsibility Pattern:

      • Problem: Passes a request along a chain of handlers, allowing multiple handlers to process the request.
      • Solution: The Chain of Responsibility pattern allows a request to pass through a chain of handlers. Each handler can either process the request or pass it along the chain.
      • Example: An event handling system where multiple handlers can handle different types of events.
    2. Command Pattern:

      • Problem: Encapsulates a request as an object, allowing for parameterization and queuing of requests.
      • Solution: The Command pattern allows you to encapsulate a request as an object, allowing it to be stored, passed, and executed at a later time.
      • Example: A remote control where each button is associated with a command (e.g., turning on the TV, increasing volume).
    3. Interpreter Pattern:

      • Problem: Defines a grammar for interpreting sentences in a given language and evaluates sentences based on that grammar.
      • Solution: The Interpreter pattern provides a way to interpret sentences based on a language’s grammar by defining the language rules as classes.
      • Example: A calculator that interprets mathematical expressions.
    4. Iterator Pattern:

      • Problem: Provides a way to access the elements of a collection sequentially without exposing its underlying representation.
      • Solution: The Iterator pattern provides a mechanism to iterate over a collection of objects without exposing the internal structure of the collection.
      • Example: A list of names where the iterator allows you to access each name one by one.
    5. Mediator Pattern:

      • Problem: Defines an object that controls the interaction between a group of objects, reducing direct dependencies between them.
      • Solution: The Mediator pattern centralizes the communication between objects, preventing them from referring to each other directly and reducing dependencies.
      • Example: A chat application where a central server (mediator) handles communication between clients.
    6. Memento Pattern:

      • Problem: Captures and externalizes an object's internal state so that it can be restored later without exposing its details.
      • Solution: The Memento pattern allows you to capture an object’s state and restore it at a later point in time.
      • Example: Undo functionality in a text editor where you can restore previous states.
    7. Observer Pattern:

      • Problem: Allows a subject to notify its observers automatically when its state changes.
      • Solution: The Observer pattern defines a one-to-many dependency between objects, where a subject notifies its observers when there’s a change in its state.
      • Example: A news agency that notifies subscribers (observers) of new articles.
    8. State Pattern:

      • Problem: Allows an object to change its behavior when its internal state changes.
      • Solution: The State pattern allows an object to change its behavior when its internal state changes, effectively acting like different objects in different states.
      • Example: A vending machine where the behavior changes depending on whether it is in the "waiting for selection," "dispensing," or "out of order" state.
    9. Strategy Pattern:

      • Problem: Defines a family of algorithms, encapsulates each one, and makes them interchangeable.
      • Solution: The Strategy pattern allows you to define a family of algorithms, encapsulate each one, and make them interchangeable without changing the client code.
      • Example: A payment system where the payment method can vary (e.g., credit card, PayPal, or cryptocurrency) and can be swapped out easily.
    10. Template Method Pattern:

      • Problem: Defines the skeleton of an algorithm in a method, allowing subclasses to implement specific steps of the algorithm.
      • Solution: The Template Method pattern defines the structure of an algorithm, allowing subclasses to implement specific steps of the algorithm.
      • Example: A file processing system where the template method defines the overall structure of processing (e.g., opening file, reading data), and subclasses implement specific reading strategies.
    11. Visitor Pattern:

      • Problem: Allows you to define new operations on elements of an object structure without changing the elements themselves.
      • Solution: The Visitor pattern allows you to add operations to a collection of objects without modifying the objects themselves.
      • Example: A file system where you can add different operations like CountFiles or CalculateSize without changing the file classes.

    Conclusion

    Design patterns provide reusable solutions to common software design problems. By using design patterns, developers can avoid reinventing the wheel and instead leverage proven strategies to solve complex design challenges efficiently. The key to successfully using design patterns is understanding when and where to apply them to achieve flexibility, maintainability, and scalability in your software architecture.

    Previous topic 19
    UML diagrams
    Next topic 21
    Software testing and quality assurance

    Past Papers

    Open this section to load past papers

    Click on Show Past Papers to see past papers.
    On This Page
      Reading Stats
      Est. reading time11 min
      Word count1,832
      Code examples0
      DifficultyIntermediate