Dezign Patterns
Abstract Factory Design Pattern
The Abstract Factory Pattern provides an interface for creating families of related or dependent objects without specifying their concrete classes.
I - Interface
// Button interface
public interface Button {
void paint();
}
// Checkbox interface
public interface Checkbox {
void paint();
}
II- Concrete classes
// Windows Products
public class WindowsButton implements Button {
public void paint() {
System.out.println("Rendering a Windows Button");
}
}
public class WindowsCheckbox implements Checkbox {
public void paint() {
System.out.println("Rendering a Windows Checkbox");
}
}
// Mac Products
public class MacButton implements Button {
public void paint() {
System.out.println("Rendering a Mac Button");
}
}
public class MacCheckbox implements Checkbox {
public void paint() {
System.out.println("Rendering a Mac Checkbox");
}
}
III - AbstractFactory Interface
public interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
IV - Concrete Factory
// Windows Factory
public class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
// Mac Factory
public class MacFactory implements GUIFactory {
public Button createButton() {
return new MacButton();
}
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
V - Client Code
public class Application {
private Button button;
private Checkbox checkbox;
public Application(GUIFactory factory) {
button = factory.createButton();
checkbox = factory.createCheckbox();
}
public void render() {
button.paint();
checkbox.paint();
}
}
✅ Advantages of Abstract Factory Pattern
- Ensures consistency among related products.
- Enforces a design where families of related objects are used together.
- Hides creation logic, keeping client code clean.
❌ Disadvantages of Abstract Factory Pattern
- Can lead to a large number of classes.
- Adding a new product type (e.g., Slider) requires changes in all factories and interfaces.