Introduction to Design Patterns: Factory, Singleton and Dependency Injection

Introduction to Design Patterns: Factory, Singleton and Dependency Injection

On25th Oct 2024, 2024-12-20T09:28:43+05:30 ByKarthik Kumar D K | read
Listen Pause Resume Stop

Design patterns are essential tools for developers looking to write clean, maintainable and scalable code. In PHP 8, leveraging design patterns can significantly enhance your software architecture.

This article introduces three fundamental design patterns: Factory, Singleton and Dependency Injection, explaining their purpose, use cases and providing practical examples.

1. Factory Pattern

What is it?

  • The Factory Pattern is a creational design pattern that defines an interface for creating objects.
  • Instead of instantiating objects directly, you delegate the responsibility of creation to a factory class, which can return different subclasses based on input parameters.

When to Use

  • When the type of object to be created isn’t known until runtime.
  • To encapsulate the object creation process, promoting code modularity and flexibility.

Example

Consider a scenario where you need to create different types of products:

interface Product {

    public function use();

}

class ConcreteProductA implements Product {

    public function use() {

        return "Using Product A";

    }

}

class ConcreteProductB implements Product {

    public function use() {

        return "Using Product B";

    }

}

 

class ProductFactory {

    public static function create(string $type): Product {

        switch ($type) {

            case 'A':

                return new ConcreteProductA();

            case 'B':

                return new ConcreteProductB();

            default:

                throw new InvalidArgumentException("Unknown product type");

        }

    }

}

// Usage

$product = ProductFactory::create('A');

echo $product->use(); // Outputs: Using Product A

Advantages

  • Simplifies object creation.
  • Promotes adherence to the Open/Closed Principle, allowing the introduction of new products without modifying existing code.

2. Singleton Pattern

What is it?

  • The Singleton Pattern restricts a class to a single instance and provides a global point of access to that instance.
  • This pattern is particularly useful when you need to control access to shared resources, like a database connection.

When to Use

  • When a single instance of a class is required to coordinate actions across the system.
  • To avoid the overhead of creating multiple instances for resources that are expensive to create.

Example

Here’s how you can implement the Singleton Pattern:

class Singleton {

    private static ?Singleton $instance = null;

    private function __construct() {

        // Private constructor to prevent direct instantiation

    }

    public static function getInstance(): Singleton {

        if (self::$instance === null) {

            self::$instance = new Singleton();

        }

        return self::$instance;

    }

    public function doSomething() {

        return "Doing something";

    }

}

// Usage

$singleton = Singleton::getInstance();

echo $singleton->doSomething(); // Outputs: Doing something

Advantages

  • Ensures controlled access to resources.
  • Provides a single point of configuration and access.

3. Dependency Injection

What is it?

  • Dependency Injection (DI) is a design pattern that implements Inversion of Control (IoC), allowing a class to receive its dependencies from an external source rather than creating them internally.
  • This leads to more modular and testable code.

When to Use

  • To improve the modularity of your code.
  • To facilitate unit testing by allowing the injection of mock dependencies.

Example

Here’s how Dependency Injection can be applied in a service class:

class Database {

    public function connect() {

        return "Database connected";

    }

}

class UserService {

    private Database $database;

    public function __construct(Database $database) {

        $this->database = $database;

    }

    public function getUser() {

        return $this->database->connect() . " - User retrieved";

    }

}

// Usage

$database = new Database();

$userService = new UserService($database);

echo $userService->getUser(); // Outputs: Database connected - User retrieved

Advantages

  • Reduces tight coupling between classes.
  • Enhances testability and maintainability of your code.

Conclusion

Incorporating design patterns into your PHP 8 projects can lead to more organized, maintainable and scalable code. The Factory Pattern streamlines object creation, the Singleton Pattern controls instance management and Dependency Injection promotes loose coupling and easier testing. By understanding and applying these patterns, you can improve the architecture of your applications and become a more effective developer.

Thanks for reading the article, for more Science & Technology related articles read and subscribe to peoples blog articles.

Labels


Related Articles

Recent Articles

Recent Quick Read

Recent Great People

We Need Your Consent
By clicking “Accept Cookies”, you agree to the storing of cookies on your device to enhance your site navigation experience.
I Accept Cookies