# Abstract Factory 

## **Abstract Factory Design Pattern কী?**

Abstract Factory হলো একটি **Creational Design Pattern**, যা concrete class-এর নাম সরাসরি উল্লেখ না করে সম্পর্কিত বা পরস্পরনির্ভর object-এর একটি family তৈরি করার interface প্রদান করে।

ধরো, একটি application-এ Dark ও Light—দুই ধরনের UI theme রয়েছে। Dark theme ব্যবহার করলে Button, TextBox এবং অন্যান্য UI component-ও Dark theme-এর সঙ্গে সামঞ্জস্যপূর্ণ হতে হবে। একইভাবে Light theme-এর ক্ষেত্রে সব component Light theme অনুসরণ করবে।

প্রতিটি component আলাদাভাবে তৈরি করলে ভুল করে ভিন্ন theme-এর component একসঙ্গে ব্যবহার করার সম্ভাবনা থাকে। Abstract Factory ব্যবহার করে একটি নির্দিষ্ট theme-এর জন্য প্রয়োজনীয় component-গুলো একই factory থেকে তৈরি করা যায়।

এই pattern-এর মূল উদ্দেশ্য শুধু object তৈরির কাজ আলাদা করা নয়; বরং সম্পর্কিত object-গুলোর creation-কে একটি সাধারণ abstraction-এর অধীনে আনা, যাতে client code concrete implementation-এর ওপর সরাসরি নির্ভর না করে।

তবে তার আগে আমাদেরকে Factory Method Design Pattern সম্পর্কে জানতে হবে।

আরেকবার রিক্যাপ করি ঃ Factory Method Design Pattern এ প্রতিটি কনক্রিট ক্লাসের জন্য আলাদা ফ্যাক্টরি ক্লাস থাকে।

Example : 

Button Interface যেখানে বাটন তৈরি করার জন্য render method declare করা হয়েছে। \

```java
public interface Button {

    public void render();

}
```

\

TextBox Interface যেখানে TextBox তৈরি করার জন্য render method declare করা হয়েছে। 

```java
public interface TextBox {

    public void render();

}
```

LightButton Class যেখানে Light Button তৈরি করার জন্য প্রয়োজনীয় লজিক ইম্প্লিমেন্ট করতে হবে। 

```java
public class LightButton implements Button {

    @Override

    public void render(){

       System.out.println("This is a Light Button");

    }

}
```

DarkButton Class যেখানে Dark Button তৈরি করার জন্য প্রয়োজনীয় লজিক ইম্প্লিমেন্ট করতে হবে। 

\

```java
public class DarkButton implements Button {

    @Override

    public void render(){

       System.out.println("This is a DarkButton");

    }

}
```

**\
**

LightTextBox Class যেখানে Light TextBox তৈরি করার জন্য প্রয়োজনীয় লজিক ইম্প্লিমেন্ট করতে হবে। 

```java
public class LightTextBox implements TextBox{

    @Override

    public void render(){

       System.out.println("This is a Light TextBox");

    }

}
```

**\
**

DarkTextBox Class যেখানে Dark TextBox তৈরি করার জন্য প্রয়োজনীয় লজিক ইম্প্লিমেন্ট করতে হবে। 

```java
public class DarkTextBox implements TextBox{

    @Override

    public void render(){

       System.out.println("This is a DarkTextBox");

    }

}
```

**\
**

**\
**

**GUIFactory যেখানে UI এর প্রয়োজনীয় কম্পনেন্ট পাস করার জন্য মেথড ডেক্লেয়ার করা হয়েছে।** 

**\
**

```java
public interface GUIFactory {

    public Button createButton();

    public TextBox createTextBox();

}
```

**\
**

LightGUI Class যেখানে Light UI এর প্রয়োজনীয় কম্পনেন্ট return করা হয়েছে। 

\

```java
public class LightGUI implements GUIFactory {

    @Override

    public Button createButton() {

        return new LightButton();

    }

    @Override

    public TextBox createTextBox() {

        return new LightTextBox();

    }

}
```

**\
**

DarkGUI Class যেখানে Dark UI এর প্রয়োজনীয় কম্পনেন্ট return করা হয়েছে। 

```java
public class DarkGUI implements GUIFactory {

    @Override

    public Button createButton() {

        return new DarkButton();

    }


    @Override

    public TextBox createTextBox() {

        return new DarkTextBox();

    }

}
```

**\
**

**public class Main {**

**\
**

    **public static void main(String\[\] args) {**

**\
**

        //LightGUI তৈরি করা হয়েছে। 

\

        **GUIFactory lightGUI = new LightGUI();**

**\
**

        **//lightGUI object থেকে createButton() method কল করে Light Button তৈরি করা হয়েছে।**  

**\
**

        **Button lightButton = lightGUI.**createButton();   

        **//This is a Light Button**

\

        **//lightGUI object থেকে createTextBox() method কল করে Light TextBox তৈরি করা হয়েছে।**  

\

        **TextBox lightTextBox = lightGUI.createTextBox();**   

         **//This is a Light TextBox**

    **}**

**\
**

**}**

```java
public class Main {


    public static void main(String[] args) {

        //LightGUI তৈরি করা হয়েছে। 

        GUIFactory lightGUI = new LightGUI();

        //lightGUI object থেকে createButton() method কল করে Light Button তৈরি করা হয়েছে।  

        Button lightButton = lightGUI.createButton();   

      
        //This is a Light Button


        //lightGUI object থেকে createTextBox() method কল করে Light TextBox তৈরি করা হয়েছে।  


        TextBox lightTextBox = lightGUI.createTextBox();   
       
         //This is a Light TextBox

    }


}
```
