Skip to main content

3_Abstract Factory Pattern

Abstract factory pattern provide concept of factory of factories. 
Abstract design pattern is on of the creational design pattern that provide us the interface of creating related or independent objects without specifying the concrete classes and their specifications.
In other words,  Abstract design pattern is the way of organizing, How we can create groups of things that are related to each other.

Think of it, like factory of factories.

Let walk through the practical example of car production system using abstract factory design pattern for getting better understanding.

Scenario:
we are building card of two different types , ElectricCars and PetrolCars. Each car have different types of 

1) Engine
2)Tyres

Goals:
Using abstract design pattern we have to create families of Electric and Petrol car parts.

What types of classes will be use in this design pattern.
1) Abstract Products (Interface).
2) Concrete Products: These are concrete classes which implement Abstract Products.
Note: Can be multiple  products.
3) Abstract Factory (Interface).
4) Concrete Factories (can be multiple factories).
5) Client Code.

Core Logic

1) Abstract Products (Interfaces)

<?php

interface Engine {
    public function getType();
}

interface Tyre {
    public function getType();
}

?>

 2) Concrete Products 
These are classes that implement Abstract Product Interfaces

1.Concrete Product for Electric Cars

<?php

class ElectricEngine implements Engine {
    public function getType() {
        return "Electric Engine";
    }
}

class ElectricTyre implements Tyre {
    public function getType() {
        return "Tyres for Electric Car";
    }
}

?>

2.Concrete Product for Petrol Cars

<?php

class PetrolEngine implements Engine {
    public function getType() {
        return "Petrol Engine";
    }
}

class PetrolTyre implements Tyre {
    public function getType() {
        return "Tyres for Petrol Car";
    }
}

?>


Now we have to create Factories that implement factory but before creating the factories, let create factory(Interface)
Note: This is the factory Interface that we use in factory design pattern which implement by concrete FactoryConcrete classes to create instances/object dynamically.

3) Abstract Factory

<?php

interface CarFactory {
    public function createEngine(): Engine;
    public function createTyre(): Tyre;
}

?>

4) Concrete Factories

<?php

class ElectricCarFactory implements CarFactory {
    public function createEngine(): Engine {
        return new ElectricEngine();
    }

    public function createTyre(): Tyre {
        return new ElectricTyre();
    }
}

class PetrolCarFactory implements CarFactory {
    public function createEngine(): Engine {
        return new PetrolEngine();
    }

    public function createTyre(): Tyre {
        return new PetrolTyre();
    }
}

?>

5) Client Logic

<?php

function produceCar(CarFactory $factory) {
    $engine = $factory->createEngine();
    $tyre = $factory->createTyre();

    echo "Producing a car with:\n";
    echo "- " . $engine->getType() . "\n";
    echo "- " . $tyre->getType() . "\n";
}

echo "--- Electric Car Production ---\n";
produceCar(new ElectricCarFactory());

echo "\n--- Petrol Car Production ---\n";
produceCar(new PetrolCarFactory());

?>

---Output---

--- Electric Car Production ---
Producing a car with:
- Electric Engine
- Tyres for Electric Car

--- Petrol Car Production ---
Producing a car with:
- Petrol Engine
- Tyres for Petrol Car


Summery

Based on the study we have done so far, we can say that each factory create consistent part.
You can easily switch from petrol to electric my changing the factory, without effecting the concrete Product class.
This approach use in the  scenarios where you have to build scalable modules like e.g CMS, payment gateways.

We have centralize the object creation logic.
Main code realize in interfaces(Engine, Tyre).
You can easily build more types of car e.g Hybrid car. You don't have to write entire new logic for it.
You need to add new Concrete Factory class of name HybridCarFactory.

Than create concrete product class class HybridEngine implements Engine { ... } 


Comments

Popular posts from this blog

Install MariaDB Latest Version 11.4 in Red Hat Version 9

 This this post i will show you step by step the installation process of mariaDB in red hat version 9. Step1 Run the command to pull the latest updated packages on applications installed in your system. -dnf update If you get Kernal update than reboot the system -reboot Step2 Go to official mariaDB site Make mariadb repository in /etc/yum.repos.d Place the configuration in this file # MariaDB 11.4 RedHatEnterpriseLinux repository list - created 2024-09-24 11:12 UTC # https://mariadb.org/download/ [mariadb] name = MariaDB # rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details. # baseurl = https://rpm.mariadb.org/11.4/rhel/$releasever/$basearch baseurl = https://mirrors.aliyun.com/mariadb/yum/11.4/rhel/$releasever/$basearch # gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB gpgkey = https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck = 1 Now install the mariaDB with its dependencies package...

MySQL course to learn queries to manage DBMS.

1. Create Table CREATE TABLE statement allows you to create new table in database. The example code is given below.  create table profile( id int, name varchar(50), birth_date date, phone varchar(12), gender varchar(1) ); Code language: SQL (Structured Query Language) ( sql ) 2. Insert data in table INSERT INTO statement is use to insert new record/data into table. INSERT INTO profile (id, name, birth_date, phone, gender) VALUES (2, "Zaib", "1996-03-15", "9238975404", "M"); Code language: SQL (Structured Query Language) ( sql ) 3. Insert multiple records at-once INSERT INTO state is use to insert multiple new record/data into table. INSERT INTO profile (id, name, birth_date, phone, gender) VALUES (1, "Usamn ali", "1990-08-26", "9238785094", "M", 18, "Karachi"), (2, "Aisha", "1997-06-12", "9238974468", "F", 19, "Lahore"), ...

Send email in php "without less secure" restriction

 => https://www.youtube.com/watch?v=Kjn5vBbBsi8 (less secure link) https://www.youtube.com/watch?v=dNTZ8X9Xk_Q&t=259s https://www.thapatechnical.com/2020/03/how-to-send-mail-from-localhost-xampp.html LARAVEL env file setup for gmail configuration MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=465 MAIL_USERNAME=exampleEmail@gmail.com MAIL_PASSWORD=yourAppPassword MAIL_ENCRYPTION=ssl MAIL_FROM_ADDRESS=exampleEmail@gmail.com MAIL_FROM_NAME="Adnan Zaib" Note: for TLS use Port : 587 for SSL use Port : 465