Abstract Factory
Overview
Provide an interface for creating families of related objects without specifying their concrete classes.
When to use
- You need consistent object families (for example, UI theme widgets).
- You want to switch product families at runtime.
Java example
interface Button {
String render();
}
interface Input {
String render();
}
class LightButton implements Button {
public String render() {
return "light-button";
}
}
class LightInput implements Input {
public String render() {
return "light-input";
}
}
class DarkButton implements Button {
public String render() {
return "dark-button";
}
}
class DarkInput implements Input {
public String render() {
return "dark-input";
}
}
interface UiFactory {
Button createButton();
Input createInput();
}
class LightUiFactory implements UiFactory {
public Button createButton() {
return new LightButton();
}
public Input createInput() {
return new LightInput();
}
}
class DarkUiFactory implements UiFactory {
public Button createButton() {
return new DarkButton();
}
public Input createInput() {
return new DarkInput();
}
}
TypeScript example
interface Button {
render(): string;
}
interface Input {
render(): string;
}
class LightButton implements Button {
render(): string {
return 'light-button';
}
}
class LightInput implements Input {
render(): string {
return 'light-input';
}
}
class DarkButton implements Button {
render(): string {
return 'dark-button';
}
}
class DarkInput implements Input {
render(): string {
return 'dark-input';
}
}
interface UiFactory {
createButton(): Button;
createInput(): Input;
}
class LightUiFactory implements UiFactory {
createButton(): Button {
return new LightButton();
}
createInput(): Input {
return new LightInput();
}
}
class DarkUiFactory implements UiFactory {
createButton(): Button {
return new DarkButton();
}
createInput(): Input {
return new DarkInput();
}
}
Pros and cons
Pros:
- Ensures consistent product families.
- Swappable factories improve flexibility.
Cons:
- More interfaces and classes.
- Harder to add new product types.
Common pitfalls
- Mixing products from different families.
- Introducing too many factory layers.