Middle
Provide examples of creational design patterns.
sobes.tech AI
Answer from AI
-
Factory Method: Defines an interface for creating an object, but lets subclasses decide which class to instantiate.
// Product interface interface Product { void operation(); } // Concrete Product A class ConcreteProductA implements Product { @Override public void operation() { System.out.println("Concrete Product A Operation"); } } // Concrete Product B class ConcreteProductB implements Product { @Override public void operation() { System.out.println("Concrete Product B Operation"); } } // Creator abstract class Creator { public abstract Product factoryMethod(); public void someOperation() { Product product = factoryMethod(); product.operation(); } } // Concrete Creator A class ConcreteCreatorA extends Creator { @Override public Product factoryMethod() { return new ConcreteProductA(); } } // Concrete Creator B class ConcreteCreatorB extends Creator { @Override public Product factoryMethod() { return new ConcreteProductB(); } } -
Abstract Factory: Provides an interface for creating families of related or dependent objects without specifying their concrete classes.
// Abstract Factory interface AbstractFactory { AbstractProductA createProductA(); AbstractProductB createProductB(); } // Abstract Products interface AbstractProductA { void usefulFunctionA(); } interface AbstractProductB { void usefulFunctionB(); void anotherUsefulFunctionB(AbstractProductA collaborator); } // Concrete Factory 1 class ConcreteFactory1 implements AbstractFactory { @Override public AbstractProductA createProductA() { return new ConcreteProductA1(); } @Override public AbstractProductB createProductB() { return new ConcreteProductB1(); } } // Concrete Factory 2 class ConcreteFactory2 implements AbstractFactory { @Override public AbstractProductA createProductA() { return new ConcreteProductA2(); } @Override public AbstractProductB createProductB() { return new ConcreteProductB2(); } } // Concrete Products for Factory 1 class ConcreteProductA1 implements AbstractProductA { @Override public void usefulFunctionA() { System.out.println("Product A1"); } } class ConcreteProductB1 implements AbstractProductB { @Override public void usefulFunctionB() { System.out.println("Product B1"); } @Override public void anotherUsefulFunctionB(AbstractProductA collaborator) { System.out.println("Product B1 collaborating with " + collaborator); } } // Concrete Products for Factory 2 class ConcreteProductA2 implements AbstractProductA { @Override public void usefulFunctionA() { System.out.println("Product A2"); } } class ConcreteProductB2 implements AbstractProductB { @Override public void usefulFunctionB() { System.out.println("Product B2"); } @Override public void anotherUsefulFunctionB(AbstractProductA collaborator) { System.out.println("Product B2 collaborating with " + collaborator); } } -
Builder: Allows step-by-step construction of complex objects. It separates the construction of a complex object from its representation, enabling the same construction process to create various representations.
// Product class Product { private String partA; private String partB; private String partC; public void setPartA(String partA) { this.partA = partA; } public void setPartB(String partB) { this.partB = partB; } public void setPartC(String partC) { this.partC = partC; } @Override public String toString() { return "Product [partA=" + partA + ", partB=" + partB + ", partC=" + partC + "]"; } } // Builder interface interface Builder { void buildPartA(); void buildPartB(); void buildPartC(); Product getResult(); } // Concrete Builder class ConcreteBuilder implements Builder { private Product product = new Product(); @Override public void buildPartA() { product.setPartA("Part A Built"); } @Override public void buildPartB() { product.setPartB("Part B Built"); } @Override public void buildPartC() { product.setPartC("Part C Built"); } @Override public Product getResult() { return product; } } // Director (optional) class Director { private Builder builder; public void setBuilder(Builder builder) { this.builder = builder; } public void construct() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } -
Prototype: Specifies the kinds of objects to create using a prototypical instance, and creates new objects by copying this prototype.
// Prototype interface Prototype extends Cloneable { Prototype clone(); void sayHello(); } // Concrete Prototype class ConcretePrototype implements Prototype { private String name; public ConcretePrototype(String name) { this.name = name; } @Override public Prototype clone() { try { return (Prototype) super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } @Override public void sayHello() { System.out.println("Hello from " + name); } } -
Singleton: Ensures a class has only one instance, and provides a global point of access to it.
class Singleton { private static Singleton instance; // Private constructor to prevent external instantiation private Singleton() { } // Global access point public static Singleton getInstance() { if (instance == null) { // Lazy initialization instance = new Singleton(); } return instance; } public void showMessage() { System.out.println("Hello from Singleton!"); } }