Thilan Dissanayaka Software Architecture Apr 26

Abstract Factory Pattern explained simply

When you want to create families of related objects without specifying their concrete classes,
the Abstract Factory Pattern is your best friend.


What is the Abstract Factory Pattern?

  • Provides an interface for creating families of related or dependent objects.
  • Does not specify their concrete classes.
  • Helps ensure that products from the same family are used together.

In short:

A factory of factories!


Real-Life Analogy

Imagine a company that manufactures furniture:

  • Modern Furniture Factory β†’ produces Modern Chair, Modern Sofa.
  • Victorian Furniture Factory β†’ produces Victorian Chair, Victorian Sofa.

The client can request a family of furniture without worrying about how it’s made.


Structure

  • Abstract Factory: Interface for creating related products.
  • Concrete Factories: Implementations that create concrete products.
  • Abstract Products: Interfaces for different types of products.
  • Concrete Products: Specific implementations of products.

Example in Java

Abstract Product Interfaces

public interface Chair {
    void sitOn();
}

public interface Sofa {
    void lieOn();
}

Concrete Products

public class ModernChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("Sitting on a Modern Chair.");
    }
}

public class VictorianChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("Sitting on a Victorian Chair.");
    }
}

public class ModernSofa implements Sofa {
    @Override
    public void lieOn() {
        System.out.println("Lying on a Modern Sofa.");
    }
}

public class VictorianSofa implements Sofa {
    @Override
    public void lieOn() {
        System.out.println("Lying on a Victorian Sofa.");
    }
}

Abstract Factory

public interface FurnitureFactory {
    Chair createChair();
    Sofa createSofa();
}

Concrete Factories

public class ModernFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new ModernChair();
    }

    @Override
    public Sofa createSofa() {
        return new ModernSofa();
    }
}

public class VictorianFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new VictorianChair();
    }

    @Override
    public Sofa createSofa() {
        return new VictorianSofa();
    }
}

Using the Abstract Factory

public class MainProgram {
    public static void main(String[] args) {
        FurnitureFactory factory = new ModernFurnitureFactory();

        Chair chair = factory.createChair();
        Sofa sofa = factory.createSofa();

        chair.sitOn();
        sofa.lieOn();

        // Switch to a different family
        factory = new VictorianFurnitureFactory();

        Chair victorianChair = factory.createChair();
        Sofa victorianSofa = factory.createSofa();

        victorianChair.sitOn();
        victorianSofa.lieOn();
    }
}

Output:

Sitting on a Modern Chair.
Lying on a Modern Sofa.
Sitting on a Victorian Chair.
Lying on a Victorian Sofa.

Why Use Abstract Factory Pattern?

  • Consistency: Ensures products from the same family are compatible.
  • Scalability: Add new families easily without changing client code.
  • Decoupling: The client doesn't know or care about the specific classes.

Real-World Use Cases

  • Cross-platform GUI toolkits (Windows, Mac, Linux UIs).
  • Theme-based applications (Light Theme Factory, Dark Theme Factory).
  • Game development (different worlds: Ice World Factory, Fire World Factory).

Abstract Factory vs Factory Method

Factory Pattern Abstract Factory Pattern
Creates one product Creates families of products
Single factory class Multiple related factories
Simpler and smaller Bigger and more abstract

Summary

The Abstract Factory Pattern is all about producing families of related objects without coupling your code to their concrete classes.
It offers flexibility, consistency, and makes your codebase ready for easy scaling and future changes.


ALSO READ
GraphQL - Interview preparation guide
Oct 01 Interview Guides

## What is GraphQL? GraphQL is a query language for APIs and a runtime for executing those queries. It allows clients to request exactly the data they need, reducing over-fetching and....

Building a Web3 CLI Tool for the Ballerina Language: From Idea to Reality
Apr 26 WSO2

πŸš€ Excited to finally share my journey of building a web3 CLI tool for Ballerina! This tool bridges the gap between Ethereum smart contracts and the Ballerina programming language by automatically....

Time based Blind SQL Injection
Apr 26 Application Security

Blind SQL Injection happens when: There is a SQL injection vulnerability, BUT the application does not show any SQL errors or query outputs directly. In this case, an attacker has to ask....

CSRF - Cross Site Request Forgery
May 27 Application Security

Cross-Site Request Forgery (CSRF) is a web security vulnerability that allows an attacker to induce users to perform actions that they do not intend to perform. It occurs when a malicious website,....

OAuth: The Secret Behind
May 17 Application Security

Ever clicked that handy "Sign in with Google" button instead of creating yet another username and password? You're not alone! Behind that convenient button lies a powerful technology called OAuth....

GDB reverse engineering tutorial
Mar 23 Low level Development

hiii, I selected an interesting topic to discuss. Here, we are going to disassemble a binary file and take a look at what it does. This process is called reverse engineering. Let's run the program....