Java Design Patterns: Singleton, Factory, Builder

#java13 เม.ย. 2569

Design Patterns คืออะไร

Design Patterns คือ solution ที่ผ่านการพิสูจน์แล้วสำหรับปัญหาที่พบบ่อยใน software design แบ่งเป็น Creational, Structural, Behavioral

Singleton Pattern

// Thread-safe Singleton
public class DatabaseConnection {
    private static volatile DatabaseConnection instance;
    private Connection connection;

    private DatabaseConnection() {
        // private constructor
        connection = createConnection();
    }

    public static DatabaseConnection getInstance() {
        if (instance == null) {
            synchronized (DatabaseConnection.class) {
                if (instance == null) {
                    instance = new DatabaseConnection();
                }
            }
        }
        return instance;
    }

    public Connection getConnection() { return connection; }
}

// Enum Singleton (แนะนำ)
public enum AppConfig {
    INSTANCE;

    private final String apiUrl = "https://api.example.com";
    public String getApiUrl() { return apiUrl; }
}

Factory Pattern

public interface Notification {
    void send(String message);
}

public class EmailNotification implements Notification {
    @Override
    public void send(String message) {
        System.out.println("Email: " + message);
    }
}

public class SMSNotification implements Notification {
    @Override
    public void send(String message) {
        System.out.println("SMS: " + message);
    }
}

// Factory
public class NotificationFactory {
    public static Notification create(String type) {
        return switch (type.toLowerCase()) {
            case "email" -> new EmailNotification();
            case "sms" -> new SMSNotification();
            default -> throw new IllegalArgumentException("Unknown type: " + type);
        };
    }
}

// ใช้งาน
Notification n = NotificationFactory.create("email");
n.send("สวัสดี!");

Builder Pattern

public class User {
    private final String name;
    private final String email;
    private final String phone;
    private final String address;

    private User(Builder builder) {
        this.name = builder.name;
        this.email = builder.email;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    public static class Builder {
        private final String name;  // required
        private final String email; // required
        private String phone;       // optional
        private String address;     // optional

        public Builder(String name, String email) {
            this.name = name;
            this.email = email;
        }

        public Builder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

// ใช้งาน
User user = new User.Builder("สมชาย", "somchai@example.com")
    .phone("0812345678")
    .address("กรุงเทพฯ")
    .build();

Observer Pattern

public interface Observer {
    void update(String event, Object data);
}

public class EventBus {
    private Map<String, List<Observer>> listeners = new HashMap<>();

    public void subscribe(String event, Observer observer) {
        listeners.computeIfAbsent(event, k -> new ArrayList<>()).add(observer);
    }

    public void publish(String event, Object data) {
        listeners.getOrDefault(event, List.of())
            .forEach(o -> o.update(event, data));
    }
}

สรุป

Design Patterns ช่วยให้โค้ดมีโครงสร้างที่ดี maintainable และ reusable ควรเรียนรู้ patterns หลักๆ เช่น Singleton, Factory, Builder, Observer, Strategy ครับ