Junior — Middle
Can you explain the concept of an abstract factory and how it is used in system design?
sobes.tech AI
Answer from AI
Abstract factory is a creational design pattern that provides an interface for creating families of related or dependent objects without specifying their concrete classes.
This is useful when a system should work with various sets of products but not depend on their specific implementations.
Example of usage:
- In a graphical user interface, you can have an abstract factory for creating buttons and windows for different operating systems (Windows, MacOS, Linux).
- Client code uses the factory interface without knowing which specific implementation is being created.
Example in Java:
// Abstract products
interface Button {
void paint();
}
interface Window {
void render();
}
// Concrete products for Windows
class WindowsButton implements Button {
public void paint() {
System.out.println("Drawing Windows button");
}
}
class WindowsWindow implements Window {
public void render() {
System.out.println("Rendering Windows window");
}
}
// Concrete products for MacOS
class MacOSButton implements Button {
public void paint() {
System.out.println("Drawing MacOS button");
}
}
class MacOSWindow implements Window {
public void render() {
System.out.println("Rendering MacOS window");
}
}
// Abstract factory
interface GUIFactory {
Button createButton();
Window createWindow();
}
// Concrete factories
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public Window createWindow() {
return new WindowsWindow();
}
}
class MacOSFactory implements GUIFactory {
public Button createButton() {
return new MacOSButton();
}
public Window createWindow() {
return new MacOSWindow();
}
}
// Client code
class Application {
private Button button;
private Window window;
public Application(GUIFactory factory) {
button = factory.createButton();
window = factory.createWindow();
}
public void paint() {
button.paint();
window.render();
}
}
// Usage
public class Demo {
public static void main(String[] args) {
GUIFactory factory = new WindowsFactory(); // or new MacOSFactory();
Application app = new Application(factory);
app.paint();
}
}
This approach facilitates system extension and support for different platforms.