Java Demonstration of
Different Design
Patterns
Singleton
Factory
Strategy
Observer
Decorator
Command
Template Method
Adapter
Builder
Composite
Proxy
For collaboration:
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Creational Design
Pattern: Singleton
static class AppConfig {
private static final AppConfig INSTANCE =
new AppConfig();
private AppConfig() {}
public static AppConfig getInstance()
{
return INSTANCE;
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Creational Design
Pattern: Factory
static class PaymentFactory {
public static PaymentStrategy
getPayment(String type) {
return switch (type) {
case "paypal" -> new
PayPalPayment();
case "card" -> new
CreditCardPayment();
default -> throw new
IllegalArgumentException("Unknown type");
};
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Behavioral Design
Pattern: Strategy
interface PaymentStrategy {
void pay(int amount);
}
static class CreditCardPayment implements
PaymentStrategy {
public void pay(int amount) {
[Link]("Paid " + amount + "
with Credit Card");
}
}
static class PayPalPayment implements
PaymentStrategy {
public void pay(int amount) {
[Link]("Paid " + amount + "
with PayPal");
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Behavioral Design
Pattern: Observer
interface Subscriber {
void update(String news);
}
static class EmailSubscriber implements Subscriber {
public void update(String news) {
[Link]("Email received: " + news);
}
}
static class NewsPublisher {
private final List<Subscriber> subs = new ArrayList<>
();
public void subscribe(Subscriber s) {
[Link](s);
}
public void notifySubs(String news) {
[Link](s -> [Link](news));
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Structural Design
Pattern: Decorator
interface Notifier {
void send(String msg);
}
static class BasicNotifier implements Notifier {
public void send(String msg) {
[Link]("Sending: " + msg);
}
}
static class SlackDecorator implements Notifier {
private final Notifier wrap;
public SlackDecorator(Notifier wrap) {
[Link] = wrap;
}
public void send(String msg) {
[Link](msg);
[Link]("Also sent to Slack: " + msg);
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Structural Design
Pattern: Command
interface Command {
void execute();
}
static class SaveCommand implements Command
{
public void execute() {
[Link]("File saved.");
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Behavioral Design
Pattern: Template Method
abstract static class ReportGenerator {
public final void generate() {
fetchData();
formatData();
export();
}
abstract void fetchData();
abstract void formatData();
void export() {
[Link]("Exported report");
}
}
static class SalesReport extends ReportGenerator {
void fetchData() {
[Link]("Fetched sales data");
}
void formatData() {
[Link]("Formatted sales report");
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Structural Design
Pattern: Adapter
interface JsonExporter {
String export();
}
static class XmlReport {
String generateXML() {
return "<data>xml</data>";
}
}
static class XmlToJsonAdapter implements JsonExporter {
private final XmlReport xml;
public XmlToJsonAdapter(XmlReport xml) {
[Link] = xml;
}
public String export() {
return "{\"converted\": true}";
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Creational Design
Pattern: Builder
static class User {
private final String name;
private final int age;
private final String email;
private User(Builder builder) {
[Link] = [Link];
[Link] = [Link];
[Link] = [Link];
}
static class Builder {
private String name;
private int age;
private String email;
public Builder name(String name) { [Link] = name; return this; }
public Builder age(int age) { [Link] = age; return this; }
public Builder email(String email) { [Link] = email; return this; }
public User build() {
return new User(this);
}
}
public String toString() {
return name + ", " + age + ", " + email;
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Structural Design
Pattern: Composite
interface UIComponent {
void render();
}
static class Button implements UIComponent {
public void render() {
[Link]("Rendering Button");
}
}
static class Panel implements UIComponent {
private final List<UIComponent> children = new ArrayList<>();
public void add(UIComponent c) { [Link](c); }
public void render() {
[Link]("Rendering Panel");
[Link](UIComponent::render);
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Category: Structural Design
Pattern: Proxy
interface Image {
void display();
}
static class RealImage implements Image {
private final String filename;
public RealImage(String filename) {
[Link] = filename;
load();
}
private void load() {
[Link]("Loading " + filename);
}
public void display() {
[Link]("Displaying " + filename);
}
}
static class ProxyImage implements Image {
private RealImage real;
private final String filename;
public ProxyImage(String filename) {
[Link] = filename;
}
public void display() {
if (real == null) real = new RealImage(filename);
[Link]();
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A
Invoking the design patterns
public static void main(String[] args) {
// Singleton
AppConfig config = [Link]();
// Factory + Strategy
PaymentStrategy payment = [Link]("card");
[Link](500);
// Observer
NewsPublisher pub = new NewsPublisher();
[Link](new EmailSubscriber());
[Link]("New release is live!");
// Decorator
Notifier notifier = new SlackDecorator(new BasicNotifier());
[Link]("Build done");
// Command
Command save = new SaveCommand();
[Link]();
// Template
ReportGenerator report = new SalesReport();
[Link]();
// Adapter
JsonExporter adapter = new XmlToJsonAdapter(new XmlReport());
[Link]("JSON: " + [Link]());
// Builder
User user = new [Link]()
.name("Alice")
.age(28)
.email("alice@[Link]")
.build();
[Link]("User: " + user);
// Composite
Panel panel = new Panel();
[Link](new Button());
[Link](new Button());
[Link]();
// Proxy
Image img = new ProxyImage("[Link]");
[Link](); // Loads and displays
[Link](); // Just displays
}
}
Email LinkedIn
nestorabiawuh@[Link] Nestor Abiangang A