Creational Pattern

https://flutterdesignpatterns.com

  • Abstract Factory

  • Builder

  • Factory Method

  • Prototype

  • Singleton

Creational 패턴의 의미

"객체 생성(Creation)"에 관한 패턴들

  • 객체를 생성하는 과정과 방법을 다루는 디자인 패턴

  • 핵심 목적: 객체 생성의 복잡성을 숨기고, 시스템을 유연하게 만들기

  • 클라이언트 코드가 구체적인 클래스에 의존하지 않도록 추상화

---------------------------------------------------------------------------------------------------------

Abstract Factory 패턴

특징: 관련된 객체들의 집합(제품군)을 생성

java

// 추상 팩토리
interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// 구체적 팩토리들
class WindowsFactory implements GUIFactory {
    public Button createButton() { return new WindowsButton(); }
    public Checkbox createCheckbox() { return new WindowsCheckbox(); }
}

class MacFactory implements GUIFactory {
    public Button createButton() { return new MacButton(); }
    public Checkbox createCheckbox() { return new MacCheckbox(); }
}

// 사용법
GUIFactory factory = new WindowsFactory();
Button button = factory.createButton(); // Windows 스타일
Checkbox checkbox = factory.createCheckbox(); // Windows 스타일

Factory Method vs Abstract Factory:

  • Factory Method: 하나의 객체 생성

  • Abstract Factory: 관련된 객체들의 제품군 생성

핵심: 플랫폼별, 테마별로 일관된 객체 집합을 생성할 때 사용

Builder 패턴

특징: 복잡한 객체를 단계별로 구성

  • 동일한 생성 과정으로 다른 표현의 객체 생성 가능

  • 생성자 매개변수가 많을 때 가독성 향상

  • 불변 객체 생성에 유용

  • 핵심: Director(지시자) + Builder(구체적 생성자) 분리

java

// Builder (구체적인 생성 방법)
class PizzaBuilder {
    private Pizza pizza = new Pizza();
    
    public PizzaBuilder dough(String dough) { 
        pizza.dough = dough; 
        return this; 
    }
    public PizzaBuilder sauce(String sauce) { 
        pizza.sauce = sauce; 
        return this; 
    }
    public PizzaBuilder cheese(String cheese) { 
        pizza.cheese = cheese; 
        return this; 
    }
    public Pizza build() { return pizza; }
}

// Director (생성 과정을 지시) 
// Director는 "무엇을 어떤 순서로 만들지"를 알고 있는 레시피북 같은 존재!
class PizzaDirector {
    private PizzaBuilder builder;
    
    public PizzaDirector(PizzaBuilder builder) {
        this.builder = builder;
    }
    
    // 하와이안 피자 만드는 과정을 지시
    public Pizza makeHawaiianPizza() {
        return builder
            .dough("thick")      // 1단계
            .sauce("tomato")     // 2단계  
            .cheese("mozzarella") // 3단계
            .topping("ham")      // 4단계
            .topping("pineapple") // 5단계
            .build();
    }
    
    // 마르게리타 피자 만드는 과정을 지시
    public Pizza makeMargheritaPizza() {
        return builder
            .dough("thin")
            .sauce("tomato")
            .cheese("mozzarella")
            .topping("basil")
            .build();
    }
}

// 사용법
PizzaBuilder builder = new PizzaBuilder();
PizzaDirector director = new PizzaDirector(builder);

Pizza hawaiian = director.makeHawaiianPizza();  // Director가 지시
Pizza margherita = director.makeMargheritaPizza(); // Director가 지시

Factory Method 패턴

특징: 객체 생성을 서브클래스에 위임

  • 객체 생성 로직을 캡슐화

  • 새로운 타입 추가 시 기존 코드 수정 없이 확장 가능

  • 느슨한 결합(loose coupling) 구현

  • 핵심: Creator 추상클래스 + ConcreteCreator들이 실제 객체 생성

java

abstract class Animal {
    abstract Animal createAnimal();
}

class Dog extends Animal {
    Animal createAnimal() { return new Dog(); }
}

class Cat extends Animal {
    Animal createAnimal() { return new Cat(); }
}

// 사용법
Animal factory = new Dog();
Animal animal = factory.createAnimal(); // Dog 인스턴스 생성

Prototype 패턴

특징: 기존 인스턴스를 복제하여 새 객체 생성

  • 객체 생성 비용이 클 때 복제로 성능 향상

  • 런타임에 동적으로 객체 생성 가능

  • Deep Copy vs Shallow Copy 고려 필요

  • 핵심: clone() 메서드를 통한 자기복제

java

class Shape implements Cloneable {
    private String type;
    
    public Shape clone() {
        try {
            return (Shape) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}

// 사용법
Shape original = new Shape();
Shape copy = original.clone(); // 복제본 생성

Singleton 패턴

특징: 클래스 인스턴스를 하나만 생성하도록 보장

  • 전역 접근점 제공

  • 메모리 절약 및 공유 자원 관리

  • 멀티스레드 환경에서 동시성 문제 주의

  • 핵심: private 생성자 + static getInstance() 메서드

java

public class Database {
    private static Database instance;
    
    private Database() {} // private 생성자
    
    public static Database getInstance() {
        if (instance == null) {
            instance = new Database();
        }
        return instance;
    }
}

// 사용법
Database db1 = Database.getInstance();
Database db2 = Database.getInstance(); // 같은 인스턴스

전체 Creational 패턴 정리

  1. Singleton: 인스턴스 1개만 보장

  2. Factory Method: 객체 생성을 서브클래스에 위임

  3. Abstract Factory: 관련 객체들의 제품군 생성

  4. Builder: 복잡한 객체를 단계별로 구성

  5. Prototype: 기존 객체 복제로 새 객체 생성

Last updated