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 패턴 정리
Singleton: 인스턴스 1개만 보장
Factory Method: 객체 생성을 서브클래스에 위임
Abstract Factory: 관련 객체들의 제품군 생성
Builder: 복잡한 객체를 단계별로 구성
Prototype: 기존 객체 복제로 새 객체 생성
Last updated