The Factory Pattern

The Factory Pattern

Introduction

The Factory Pattern is a cornerstone of object-oriented programming (OOP) in software design patterns.

It is a versatile and flexible approach for creating objects without specifying the concrete class at compile-time.

This abstraction allows developers to decouple the creation of objects from their usage, promoting code reusability and maintainability.

Understanding the Factory Pattern

The Factory Pattern encapsulates the logic for creating objects in a separate factory class.

This factory class mediates between the client code and the object creation process.

It provides an interface for creating specific types of objects based on external criteria or configuration settings.

Benefits of the Factory Pattern

The Factory Pattern offers several advantages, including:

  • Encapsulation of Object Creation: It separates the creation of objects from their usage, promoting code modularity and reusability.
  • Implementation Hiding: It encapsulates the details of object creation, allowing clients to focus on using the objects without understanding their implementation details.
  • Abstraction of Object Creation: It abstracts the creation of objects, enabling the selection of the appropriate concrete class based on runtime conditions or configuration settings.
  • Flexibility in Object Creation: It allows for creating various objects from a common interface, promoting code flexibility and adaptability.

Types of Factory Patterns

The Factory Pattern encompasses several variations, each with its specific implementation and usage:

  • Simple Factory: This pattern provides a single factory method to create objects based on a predefined set of types.
  • Factory Method: This pattern involves a base factory class and concrete factory classes, each responsible for creating objects of its own type.
  • Abstract Factory: This pattern defines an interface for creating families of related products. Concrete factories specialise in creating products from a specific family.

Implementing the Factory Pattern in C#

To illustrate the implementation of the Factory Pattern in C#, consider a simplified scenario of creating different types of shapes:

(These are simple examples with silly magic strings in them. They are to keep things simple. Don’t do this with real code.)

Shape Interface

public interface IShape
{
    void Draw();
}

Concrete Shapes

public class Square : IShape
{
    public void Draw()
    {
        System.Console.WriteLine("Drawing a Square");
    }
}

public class Circle : IShape
{
    public void Draw()
    {
        System.Console.WriteLine("Drawing a Circle");
    }
}

Simple Factory Implementation

public class ShapeFactory
{
    public static IShape CreateShape(string shapeType)
    {
        if (shapeType == "Square")
        {
            return new Square();
        }
        else if (shapeType == "Circle")
        {
            return new Circle();
        }
        else
        {
            throw new InvalidOperationException("Invalid shape type: " + shapeType);
        }
    }
}

Using the Factory

IShape square = ShapeFactory.CreateShape("Square");
square.Draw(); // Output: Drawing a Square

IShape circle = ShapeFactory.CreateShape("Circle");
circle.Draw(); // Output: Drawing a Circle

This example demonstrates a basic implementation of the Simple Factory Pattern, where a single factory method creates objects based on a provided string.

Conclusion

The Factory Pattern serves as a valuable tool in software development, providing a flexible and extensible approach for object creation.

By decoupling object creation from their usage, it promotes code reusability, maintainability, and adaptability.

Developers can leverage the Factory Pattern to effectively manage object creation complexities and enhance the overall structure and maintainability of their applications.

Stephen

Hi, my name is Stephen Finchett. I have been a software engineer for over 30 years and worked on complex, business critical, multi-user systems for all of my career. For the last 15 years, I have been concentrating on web based solutions using the Microsoft Stack including ASP.Net, C#, TypeScript, SQL Server and running everything at scale within Kubernetes.