import java.util.*;
import java.lang.*;
import java.io.*;

// CLIENT
class Main {
    public static void main(String[] args) {
        // Direct use of the Builder
        Notification customNotification = Notification.builder("admin", "user")
                .subject("Custom Subject")
                .message("This is a custom notification")
                .attachment("file.txt")
                .build();

        // Using Director with a predefined "recipe"
        NotificationDirector director = new NotificationDirector(Notification.builder("system", "guest"));
        Notification welcomeNotification = director.constructWelcomeNotification();
        Notification urgentNotification = director.constructUrgentAlert("System is down!");

        System.out.println(customNotification);
        System.out.println(welcomeNotification);
        System.out.println(urgentNotification);
    }
}

// PRODUCT
class Notification {
    private final String to;
    private final String from;
    private final String subject;
    private final String message;
    private final List<String> attachments;
    private final boolean urgent;

    // Private constructor: ensures invariants (critical validations)
    private Notification(NotificationBuilder builder) {
        if (builder.from == null || builder.from.isBlank()) {
            throw new IllegalArgumentException("From cannot be null or blank");
        }
        if (builder.to == null || builder.to.isBlank()) {
            throw new IllegalArgumentException("To cannot be null or blank");
        }

        this.to = builder.to;
        this.from = builder.from;
        this.subject = builder.subject;
        this.message = builder.message;
        this.attachments = builder.attachments;
        this.urgent = builder.urgent;
    }

    // Getters

    @Override
    public String toString() {
        return "Notification{" +
                "to='" + to + '\'' +
                ", from='" + from + '\'' +
                ", subject='" + subject + '\'' +
                ", message='" + message + '\'' +
                ", attachments=" + attachments +
                ", urgent=" + urgent +
                '}';
    }

    public static NotificationBuilder builder(String from, String to) {
        return new NotificationBuilder(from, to);
    }

    // BUILDER (abstract/base builder structure)
    // CONCRETE BUILDER (the concrete implementation)
    public static class NotificationBuilder {
        private final String from;
        private final String to;
        private String subject;
        private String message;
        private List<String> attachments;
        private boolean urgent;

        // Fron and To atributes are required
        public NotificationBuilder(String from, String to) {
            this.from = from;
            this.to = to;
            this.attachments = new ArrayList<>();
        }

        public NotificationBuilder subject(String subject) {
            this.subject = subject;
            return this;
        }

        public NotificationBuilder message(String message) {
            this.message = message;
            return this;
        }

        public NotificationBuilder attachment(String attachment) {
            Objects.requireNonNull(attachment);
            this.attachments.add(attachment);
            return this;
        }

        public NotificationBuilder urgent(boolean urgent) {
            this.urgent = urgent;
            return this;
        }

        // Convenience validations
        public Notification build() {
            if (attachments.size() > 0 && (message == null || message.isBlank())) {
                throw new IllegalStateException("A message must be provided if there are attachments.");
            }
            return new Notification(this);
        }
    }
}


// DIRECTOR
class NotificationDirector {
    private final Notification.NotificationBuilder builder;

    public NotificationDirector(Notification.NotificationBuilder builder) {
        this.builder = builder;
    }

    public Notification constructWelcomeNotification() {
        return builder
                .subject("Welcome!")
                .message("Thanks for joining our platform.")
                .attachment("intro.pdf")
                .build();
    }

    public Notification constructUrgentAlert(String alertMessage) {
        return builder
                .subject("URGENT ALERT")
                .message(alertMessage)
                .urgent(true)
                .build();
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: