생성 패턴(Creational Patterns)은 객체 생성의 메커니즘을 다루는 디자인 패턴으로, 객체 생성 과정을 캡슐화하고 클라이언트 코드와의 결합도를 낮춰 유연성과 재사용성을 높입니다. 아래에서는 대표적인 생성 패턴들에 대해 상세히 분석하겠습니다.
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
abstract class Product {
public abstract void use();
}
class ConcreteProductA extends Product {
public void use() {
System.out.println("Using ConcreteProductA");
}
}
class ConcreteProductB extends Product {
public void use() {
System.out.println("Using ConcreteProductB");
}
}
abstract class Creator {
public abstract Product factoryMethod();
}
class ConcreteCreatorA extends Creator {
public Product factoryMethod() {
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
public Product factoryMethod() {
return new ConcreteProductB();
}
}
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
class WinFactory implements GUIFactory {
public Button createButton() {
return new WinButton();
}
public Checkbox createCheckbox() {
return new WinCheckbox();
}
}
class MacFactory implements GUIFactory {
public Button createButton() {
return new MacButton();
}
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
interface Button {
void paint();
}
interface Checkbox {
void paint();
}
class WinButton implements Button {
public void paint() {
System.out.println("Rendering a button in Windows style.");
}
}
class MacButton implements Button {
public void paint() {
System.out.println("Rendering a button in Mac style.");
}
}
class WinCheckbox implements Checkbox {
public void paint() {
System.out.println("Rendering a checkbox in Windows style.");
}
}
class MacCheckbox implements Checkbox {
public void paint() {
System.out.println("Rendering a checkbox in Mac style.");
}
}
class Product {
private String partA;
private String partB;
public Product(String partA, String partB) {
this.partA = partA;
this.partB = partB;
}
}
class ProductBuilder {
private String partA;
private String partB;
public ProductBuilder() { }
public ProductBuilder partA(String partA) {
this.partA = partA;
return this;
}
public ProductBuilder partB(String partB) {
this.partB = partB;
return this;
}
public Product build() {
return new Product(this.partA, this.partB);
}
}
abstract class Prototype implements Cloneable {
public Prototype clone() throws CloneNotSupportedException {
return (Prototype) super.clone();
}
}
class ConcretePrototype extends Prototype {
private String field;
public ConcretePrototype(String field) {
this.field = field;
}
public String getField() { return field; }
}
생성 패턴은 객체 생성의 유연성과 재사용성을 높이기 위해 사용되며, 다양한 상황에서 객체 생성의 복잡성을 효과적으로 관리할 수 있는 방법을 제공합니다. 각 패턴을 상황에 맞게 적용하는 것이 중요합니다.