전공 서적/해드퍼스트 디자인 패턴

태태개발일지 - 펙토리패턴 & 싱글톤 패턴

태태코 2024. 11. 7. 15:03
반응형

팩토리 팬턴

정의:

객체를 생성하는 일을 맡는 별도의 "팩토리" 역할을 하는 클래스를 두어서, 객체를 직접 만들지 않고 필요한 곳에서 팩토리 클래스를 통해 필요한 객체를 생성하도록 하는 디자인 패턴.

 

ex) 

미국에 피자가게가 있다고 가정하자, 만약 피자를 만들려면 아래와 같이 만들어야 할 것이다.

public class PizzaStroe{

	public static Pizza createPizza(String type){
		
        if(type = "뉴욕 치즈 피자"){
          NWCheesePizza nyPizza = new NWCheesePizza();
          return nyPizza;
        }else if(type = "시카고 치즈 피자"){
          CHCheesePizza chPizza = new CHCheesePizza();   
          return chPizz;
        }

	}
	


}

 

 

다음과 같은 방식으로 조건에 맞는 피자를 만들 것이고, 이렇게되면 피자집이 type에 따라 피자를 생성하는 방법을 알고 있어야 한다.

 

이를 분리시키기 위해서  팩토리 패턴을 사용한다.

 

1. Pizza라는 추상 클래스를 만든다. prepare(), bake(), cut(), box() 라는 메서드를 만든다.

 

2. 각 피자 종류별로 구현 클래스를 만든다.

ex) CheesePizza, PepperoniPizza, VeggiePizza

 

3. 피자 팩토리 클래스를 만든다.

class PizzaFactory {
    public Pizza createPizza(String type) {
        if (type.equals("cheese")) {
            return new CheesePizza();
        } else if (type.equals("pepperoni")) {
            return new PepperoniPizza();
        } else if (type.equals("veggie")) {
            return new VeggiePizza();
        }
        return null;
    }

 

이렇게 되면 피자의 종류를 추가하거나 수정하려고 할때 피자 펙토리 클래스만 수정하면 되기때문에, 피자 스토어는 피자를 만드는 방법이나 수정할 필요가 없게되는 부분이다.

 

OCP가 가능해진다는 소리다.

 

여기서 더 깊숙하게 들어간다면,

피자 가게도 지점마다 다를 수 있기때문에 PizzaStore를 추상객체로 만들어서 createPizza 메서드를 추상메서드로 만들어서 서브클래스에서 각각 구현하게 끔 만들 수 있다.

 

또한 Pizza 또한 Pizza를 기반으로 서브클래스들을 만들어서 펙토리 클래스를 활용하여 만들 수 있다.

 

 

싱글톤 패턴

 

정의싱글톤 패턴(Singleton Pattern)은 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 디자인 패턴이다. 하나의 객체만 필요할 때 사용하고, 주로 자원 관리가 중요한 시스템에서 많이 쓰여. 이 패턴을 쓰면, 특정 클래스의 객체가 여러 개 만들어지지 않고 딱 하나만 존재하도록 강제할 수 있다.

 

public class Logger {
    // 유일한 Logger 인스턴스를 저장할 private 정적 변수
    private static Logger instance;

    // 생성자를 private로 선언하여 외부에서 인스턴스 생성 불가
    private Logger() {
        // 인스턴스가 생성될 때 필요한 초기 설정을 여기서 할 수 있음
    }

    // 인스턴스를 반환하는 메서드, 처음 호출되었을 때만 인스턴스 생성
    public static Logger getInstance() {
        if (instance == null) {
            instance = new Logger();
        }
        return instance;
    }

    // 로그 기록 메서드
    public void log(String message) {
        System.out.println("Log message: " + message);
    }
}

 

 

하지만 이런 코드는 직렬화와 멀티스레드 환경, 리플렉션에 대한 안정성을 보장하지 않는다.

각각 코드를 구현하던지, 아니면 이를 Enum을 사용하면 완벽하게 대응할 수 있다.

반응형