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();
}
}
To embed this project on your website, copy the following code and paste it into your website's HTML: