본문 바로가기

CS knowledge/Design Pattern

SingleTon And Factory Pattern

1. 싱글톤 패턴 (Singleton Pattern)

✅ 정의

  • 하나의 객체를 공유해서 사용하는 패턴
  • 클래스 내부에 단 한 번만 객체를 생성하고, 계속 그 객체만 반환

✅ 핵심 개념

  1. 하나의 클래스 변수에 단 한 번 객체가 할당되고, 이후에는 바뀌지 않음
  2. 모든 코드에서 동일한 인스턴스를 공유함

🤝 의존성 주입(DI)과 결합도 완화

  • 의존성 주입: 클래스의 멤버변수를 생성자를 통해 외부에서 주입하는 방식

🔹 장점

  • 다양한 구현체(MemberRepo, SalesRepo 등)를 유연하게 주입 가능
  • 테스트 코드에서 MockRepo 등으로 교체 쉬움

🔹 단점 (DI를 사용하지 않을 때)

  • 클래스 내부에서 new로 직접 생성하면,
    • 특정 구현체로 고정
    • 테스트 및 확장이 어려움
    • 결합도 상승

❗ 오해 주의

싱글톤은 하나의 테스트에서 한 객체를 공유하는 구조이지,
모든 테스트나 전역 코드가 무조건 같은 객체를 강제 공유하는 구조는 아님.


2. 팩토리 패턴 (Factory Pattern)

✅ 정의

  • 객체 생성 로직을 팩토리(공장)에 위임해
    객체의 생성과 사용을 분리하는 패턴

❌ 직접 생성 시 문제점 (결합도 높음)

Animal animal = new Dog(); // 강한 결합
  • Dog 클래스가 바뀌면 이 코드도 함께 수정해야 함
  • 클래스 이름, 생성자 변경 시 영향 받음

✅ 팩토리 패턴 적용 (결합도 낮음)

Animal animal = AnimalFactory.getAnimal("Dog");
  • 객체 생성 책임을 AnimalFactory에 위임
  • main() 등 사용하는 코드 변경 없이 새 동물 추가/변경 가능

✅ 핵심 효과

  • 결합도 감소: 객체 생성 로직을 감춤
  • 유지보수 용이: 팩토리만 수정하면 됨
  • 확장성 증가: 다양한 구현체 대응 가능

🧑🏻‍💻 코드

interface Animal {
    void speak();
}

class Dog implements Animal{
    public void speak(){
        System.out.println("멍멍");
    }
}

class Cat implements Animal{
    public void speak(){
        System.out.println("야옹");
    }
}

public class Factory {
    public static Animal getAnimal(String type){
        if(type.equals("Dog")){
            return new Dog();
        }
            return new Cat();
    }

    public static void main(String[] args){
        Animal dog = getAnimal("Dog");
        dog.speak();

        Animal cat = getAnimal("Cat");
        cat.speak();
    }
}

💡 요약

항목 직접 생성 (new) 팩토리 패턴 사용
결합도 높음 낮음
유연성 낮음 높음
변경 시 영향 코드 여러 곳 수정 필요 팩토리만 수정하면 됨
테스트 용이 낮음 높음

'CS knowledge > Design Pattern' 카테고리의 다른 글

전략 패턴  (1) 2025.07.24
Dependency Injection Principle  (1) 2025.07.15